我一直在玩 Swift 中的函数式编程。但是,我遇到了一个问题。
如果我在一种类型的集合上调用 map,如何创建另一种类型的新集合?
var fontFamilyMembers = [[Any]]()
//...
let postscriptNames = fontFamilyMembers.map {
[
"name": $0[0] as! String,
"weight": $0[2] as! Int,
"traits": $0[3] as! UInt
]
}
// Error: Value of type 'Any?' has no member 'count'
lengths = postscriptNames.map { $0["name"].count }
我知道我需要将$0["name"]
转换为字符串。为什么我已经在上面做过了,我必须这样做?("name": $0[0] as! String
(。那是因为postscriptNames
也是[[Any]]()
型吗?
我试过这个:
// Error: Cannot convert value of type 'Int' to closure result type 'String'
fontPostscriptNames = postscriptNames.map { ($0["name"] as! String).count }.joined(separator: "n")
。但知道我加倍困惑。
如何让地图返回每个"name"
的计数?
更新
我最初的问题仍然存在。但是,我可以通过使用结构体来完全避免这个问题,而不是我认为在 Swift 中首选的字典。
let postscriptNames = fontFamilyMembers.map {
(
name: $0[0] as! String,
weight: $0[2] as! Int,
traits: $0[3] as! UInt
)
}
lengths = postscriptNames.map { $0.name.count }
是因为postscriptNames也是[Any]类型吗?
是的。由于postscriptNames
是[Any]
类型,您需要将$0.name
向下转换为字符串
lengths = postscriptNames.compactMap { ($0.name as? String).count }
将其向下转换为字符串以获取计数。