
我尝试在dotSwift 2016 Demo中重新创建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.
相反,在你的代码中,你让ListData = Json为? [[字符串:AnyObject].你的ListData是[[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)} 总结 以上是内存溢出为你收集整理的ios – Swift中的FlatMap和Init全部内容,希望文章能够帮你解决ios – Swift中的FlatMap和Init所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)