结构
我试图在dotSwift 2016演示中由Chris Edihoff给出的演示中重新创建代码。这是代码。
struct List {
let name:String
let id:Int
}
extension List {
init?(json: [String:AnyObject]) {
guard
let name = json["name"] as? String,
let id = json["id"] as? Int else
{
return nil
}
self.name = name
self.id = id
}
}
let listData = json["data"] as? [[String:AnyObject]]
到现在为止一切似乎还不错。但这就是问题所在。他做了这样的事情:
let list:[List] = listData.flatMap(List.init)
上一行应该返回列表对象数组。克里斯·埃迪霍夫(Chris Edihoff)似乎没有任何问题,但是当我这样做时,Xcode警告
-flatMap生成'U?',而不是预期的上下文结果类型'_?
还有List.init
这里呢?我从未见过这种对象初始化的方式。应该是这样List()
,如果我们在这里使用客户初始化,应该List(json:someObject)
正确吗?
参考Chris Edihof Talk:https://www.youtube.com/watch?v = ewk-XNzXzAA
无法编译此代码的原因有多种。首先,不需要您下标json["data"]
-FlatMap的工作是遍历该数据并初始化列表。
我看到在原始演示文稿中,listData.flatMap
有一个if let
步骤。意味着listData将被解包,而不是nil。
在您的代码中,您有let listData = json as? [[String:AnyObject]]
。您的listData是type的可选[[String:AnyObject]]?
。
因此,解决此问题的方法是:
if let listData = json as? [[String:AnyObject]] {
let list = listData.flatMap(List.init)
//do something with list
}
在这里,listData是正确的类型:[[String: AnyObject]]
。
关于List.init
,这只是将初始化程序显式应用到flatMap提供的任何方法。您可以用更详细的方式(但可能更清楚的方式)重写该函数:
listData.flatMap {data in List(json: data)}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句