Binder в RxSwift, который принимает необязательный Any - PullRequest
0 голосов
/ 26 октября 2018

Я хотел бы создать реактивное расширение для UIButton, которое будет принимать любой объект (значение и ссылочный тип) и активировать кнопку на основе значения. Если это ноль, я хочу отключить кнопку и включить, если это значение.

вот код:

extension Reactive where Base: UIButton {
    var isEnabledForModel: Binder<Any?> {
        return Binder(base, binding: { 
            $0.isEnabled = $1 != nil
        })
    }
}

Когда я пытаюсь связать наблюдаемое, которое содержит необязательную структуру, я получаю ошибку: Ambiguous reference to member 'bind(to: ). Есть ли способ передать Any в Binder или достичь его другим способом? Может быть, я хочу сделать это слишком общим.

1 Ответ

0 голосов
/ 26 октября 2018

Да, вы пытаетесь сделать что-то слишком общее.Например, если вы хотите, чтобы кнопка была отключена для отсутствующей строки, вы, вероятно, также хотите, чтобы она была отключена для пустой строки, но нет никакого способа выразить это в вашей подшивке.

Тем не менее, ваш код компилируется нормальнодля меня.Я предлагаю вам почистить папку сборки и перестроить.Несмотря на то, что он компилируется, точка использования становится более сложной, чем я думаю, вам бы хотелось.

let foo = Observable<Int?>.just(nil)
foo
    .map { $0 as Any? }
    .bind(to: button.rx.isEnabledForModel)
    .disposed(by: bag)

Обратите внимание, что вам нужно вручную отобразить Int? в Any?.Если вы удалите карту, вы получите ошибку «Общий параметр« Self »не может быть выведен».Поскольку это универсальный параметр, система не будет искать возможные совпадения через дерево наследования и поэтому не примет isEnabledForModel.

.
...