0

因此,我最近开始尝试将ReactiveSwift加入到我的项目中,我似乎无法弄清楚为什么我的代码的这一部分给我编译错误,当我尝试使用<〜运算符设置属性时。针对可选MutableProperty的Reactive Swift绑定未设置?

所以这是我到目前为止,

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!) 
} 

因此,大家可以看到,给我一个错误混淆了我,因为我已经设置它,所以我不会是一个可选属性线之上理解为什么它说无价值是不相容的。此外,如果有更好的方法做到这一点,请让我知道,因为我发现很难找到用于迅速的reactivecocoa的资源

+0

尝试为你的'map'闭包添加一个类型注解,以明确显示它返回'BodyDetailViewModel?'。 – jjoelson

回答

1

这似乎是一个Swift类型推断限制。我可以重现类似的错误,而无需使用ReactiveSwift:

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

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

在斯威夫特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?为闭包定义,并看看是否能工程。