可选的MutableProperty的反应性Swift绑定未设置?

时间:2017-06-15 08:36:25

标签: swift reactive-programming reactive-cocoa reactive-swift

所以我最近开始尝试将ReactiveSwift合并到我的项目中,当我尝试使用<〜运算符设置属性时,我似乎无法弄清楚为什么我的代码的这一部分给了我一个编译错误

所以这就是我到目前为止所拥有的,

let bodyDetailViewModel = MutableProperty<BodyDetailViewModel?>(nil)

bodyManager = BodyManager()

let bodyDetailReadySignal = Signal.combineLatest(bodyManager.bodypartName.signal,
                                                     bodyManager.bodypartDetail.signal,
                                                     bodyManager.bodypartThumbnail.signal,
                                                     bodyManager.bodypartHighlighted.signal)

bodyDetailViewModel <~ bodyDetailReadySignal.map {
    if $3 == nil { return nil } // this line says Nil is incompatible with BodyDetailViewModel
    return BodyDetailViewModel(name: $0, detail: $1, thumbnail: $2, highlighted: $3!)
}

因为你可以在上面看到给我一个错误的行让我困惑,因为我已将它设置为可选属性,所以我不明白为什么它说nil值不兼容。如果有更好的方法,请告诉我,因为我发现很难找到针对swift的reactivecocoa的资源

1 个答案:

答案 0 :(得分:1)

这似乎是Swift类型推理限制。我可以在不使用ReactiveSwift的情况下重现类似的错误:

let arr = [1, 2, 3, 4]

let newArr = arr.map { elem in 
    if elem % 2 == 1 { return nil } 
    return elem / 2
}

在Swift 3.1.1中,这给出了错误&#34;无法推断出复杂的闭包返回类型;添加显式类型以消除歧义&#34;。

这有效:

let arr = [1, 2, 3, 4]

let newArr = arr.map { elem -> Int? in 
    if elem % 2 == 1 { return nil } 
    return elem / 2
}

因此,请尝试将-> BodyDetailViewModel?添加到闭包定义中,看看是否有效。