0

Also habe ich vor kurzem angefangen zu versuchen, ReactiveSwift in mein Projekt zu integrieren, und ich kann nicht herausfinden, warum dieser Teil meines Codes mir einen Kompilierfehler gibt, wenn ich die Eigenschaft mit dem < ~ Operator festlegen möchte.Reaktive Swift-Bindungen für optionale MutableProperty werden nicht festgelegt?

So, hier ist das, was ich bisher,

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

So wie Sie über die Linie sehen, die mir ein Fehler gibt verwirrt mich, weil ich es festgelegt haben eine optionale Eigenschaft zu sein, so dass ich nicht tun verstehe, warum es nicht kompatibel ist, wenn man sagt, es sei kein Wert. Auch wenn es bessere Möglichkeiten gibt, lassen Sie es mich bitte wissen, da ich es schwer finde, Ressourcen für reaktiven Kakao zu finden.

+0

Versuchen Sie eine Typ-Annotation für Ihre 'map'-Schließung hinzuzufügen, um explizit anzuzeigen, dass' BodyDetailViewModel? 'Zurückgegeben wird. – jjoelson

Antwort

1

Dies scheint eine Swift-Inferenz-Einschränkung zu sein. Ich kann einen ähnlichen Fehler reproduzieren, ohne ReactiveSwift mit:

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

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

In Swift 3.1.1 dies gibt den Fehler „nicht in der Lage komplexen Schließung Rückgabetyp zu schließen, fügen Sie explizite Art eindeutig zu machen“.

Dies funktioniert:

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

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

So versuchen -> BodyDetailViewModel? zu Ihrer Schließung Definition hinzufügen und sehen, ob das funktioniert.

Verwandte Themen