Swift 5.1:如何在一种类型的集合上调用 map 并返回另一种类型的集合?



我一直在玩 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 }

将其向下转换为字符串以获取计数。

最新更新