Реактивные привязки Swift для необязательного MutableProperty не устанавливаются?

Итак, недавно я начал пытаться включить 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 несовместимо. Также, если есть лучшие способы сделать это, пожалуйста, дайте мне знать, так как мне трудно найти ресурсы для reactivecocoa для быстрого


person Edward Lim    schedule 15.06.2017    source источник
comment
Попробуйте добавить аннотацию типа для замыкания map, чтобы явно показать, что оно возвращает BodyDetailViewModel?.   -  person jjoelson    schedule 15.06.2017


Ответы (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? к определению замыкания и посмотрите, сработает ли это.

person jjoelson    schedule 15.06.2017