0

因此,我最近开始尝试将 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 值是不兼容的。另外,如果有更好的方法,请告诉我,因为我发现很难找到快速反应可可的资源

4

1 回答 1

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 中,这给出了错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。

这有效:

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

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

因此,尝试添加-> BodyDetailViewModel?到您的闭包定义中,看看是否可行。

于 2017-06-15T13:47:19.867 回答