Ошибка сегментации компилятора Swift с использованием `ReferenceWritableKeyPath`

Использование ReferenceWritaleKeyPath для чтения свойства вызывает ошибку сегментации компилятора.

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

protocol Bindable: class {
    var observers: [NSKeyValueObservation] {get set}
}

extension Bindable {
    func bind<Value>(to targetKeyPath: ReferenceWritableKeyPath<Self, Value>, from sourceKeyPath: KeyPath<Self, Value>)
        where Self: NSObject {
        self.observers.append( self.observe(sourceKeyPath, options: [.initial, .new]) {object, change in

            // FAILS: compiler failed due to signal: Segmentation fault: 11
            if( self[keyPath:targetKeyPath] != change.newValue ) {  
                self[keyPath: targetKeyPath] = change.newValue!
            }
        })
    }
}

person Jim Leask    schedule 05.07.2017    source источник


Ответы (1)


Проблема в том, что вы пытаетесь использовать != с универсальным типом Value, который не обязательно имеет реализации == и !=. Замена <Value> на <Value: Equatable> решает эту проблему.

Сказав это, сбой компилятора из-за ошибки сегментации всегда является ошибкой, независимо от того, правильный у вас код или нет. Вам следует подумать о том, чтобы отправить отчет об ошибке на https://bugs.swift.org, если у вас есть время.

person Tim Vermeulen    schedule 05.07.2017
comment
Я пробовал ‹Value:String›, но String не является протоколом или классом, так что это не сработало. Равенство - то, что мне было нужно. Я зарегистрировал ошибку сегментации, как было предложено: SR-5375. - person Jim Leask; 05.07.2017