ios – Swift中的FlatMap和Init

ios – Swift中的FlatMap和Init,第1张

概述结构 我尝试在dotSwift 2016 Demo中重新创建Chris Edihoff演示的代码.这是代码. struct List { let name:String let id:Int}extension List { init?(json: [String:AnyObject]) { guard let name = j 结构

我尝试在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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1209417.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存