Swift中的FlatMap和Init

Prajeet Shrestha

结构

我试图在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

m

无法编译此代码的原因有多种。首先,不需要您下标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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift中flatMap的定义

来自分类Dev

Swift 1.2中可选展开功能中Map和flatMap的区别

来自分类Dev

Swift 3中的Init方法

来自分类Dev

在Swift 2中含糊不清地使用“ init”和可选参数

来自分类Dev

SWIFT:init和super.init之间的区别

来自分类Dev

CFStringTransform和Swift 3对'init'的歧义使用

来自分类Dev

在Swift 3中,joind()或flatMap(_ :)的性能更好吗?

来自分类Dev

RxJava中的concatMap和flatMap有什么区别

来自分类Dev

Scala中的flatMap函数和返回类型错误

来自分类Dev

Scala 在 map() 和 flatMap() 中处理匿名对象的语法

来自分类Dev

Swift 2.0 flatMap的用法

来自分类Dev

Swift中init属性的语法糖?

来自分类Dev

Swift:在init中调用self方法

来自分类Dev

在Swift中重写多个重载的init()方法

来自分类Dev

Swift枚举中的默认init被忽略

来自分类Dev

如何在Swift中编写init方法?

来自分类Dev

在Swift 2.2中模糊使用init

来自分类Dev

Swift协议中的“ init”-什么用?

来自分类Dev

如何在Swift中编写init方法?

来自分类Dev

在Swift中重写多个重载的init()方法

来自分类Dev

init函数中的Swift嵌套类型

来自分类Dev

wxPython中的OnInit和__init__

来自分类Dev

Haskell的头尾init和GHCi中的末尾

来自分类Dev

Vertx 类中 init() 的目的和行为

来自分类Dev

获取窗口宽度和高度,在 init 中

来自分类Dev

javascript中init()函数的定义和使用

来自分类Dev

在Swift和init(windowNibName)中子类化NSWindowController

来自分类Dev

在Swift和init中子类化NSWindowController(windowNibName)

来自分类Dev

Swift-找不到'init'和'round'的重载