Swift Type vs明确解包的Type

时间:2015-08-21 12:23:52

标签: arrays swift

我只想在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类型?

2 个答案:

答案 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]