我只想在Swift中使用.map
闭包并偶然发现:
//var oldUsers = [User]() -> containting >=1 Users at runtime
//var invitedUsers = [String]() -> gets filled with userIds during runtime by the user clicking on people to invite
let oldIds = self.oldUsers.map {$0.userId} //userId is of Type String!
println(oldIds) //-> returns Array<String!>
var allUsers = self.invitedUsers + oldIds
最后一行不会编译,因为它说你不能组合
[(String)] and Array<String!>
通过在地图中进行强制转换来快速修复它
let oldIds = self.oldUsers.map {$0.userId as String}
不应该是一样的吗?我会理解我是否需要先打开一个可选的[String?]数组。为什么需要强制转换,因为object属性已经是一个显式解包的String类型?
答案 0 :(得分:4)
[(String)]
和Array<String!>
完全没有相同之处。
此外,String!
并非显式解包,而是隐式解包。它被称为隐式解包,因为我们可以尝试将其用作String
,而无需显式编写任何解包代码。同时,明确地编写解包代码被称为显式解包...
但在一天结束时,重点是[String]
和[String!]
是不同的类型。它们似乎足够接近,但Swift对它的类型非常严格。
组合这两个数组的结果是什么?它应该是[String]
吗?还是[String!]
?无论哪种方式,它与进入它的两种类型都不一样,所以它会让人感到困惑。没有合理的方法来确定它应该是什么类型的数组。
因此,您可以选择将[String!]
投射到[String]
并希望它不包含nil
值,或者将[String]
投射到[String!]
},然后你可以结合。
答案 1 :(得分:0)
由于你没有明确给出你的闭包类型,Swift正在为你推断它。
无论如何,我认为转换结束的结果类型有点奇怪,使用完整的闭包语法会更好:
let oldIds = self.oldUsers.map {(user) -> String in user.userId}
在这里,您明确告诉Swift您的闭包返回类型是String,因此映射结果类型应为[String]
。