Проблема в bExpectedValue
.Это свойство экземпляра в B
.Это взаимодействует с определением &&
в Bool:
static func && (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
. @autoclosure
превращает b == bExpectedValue
в замыкание, фиксируя его как self.bExpectedValue
.Это не разрешено до завершения инициализации.(Закрытие здесь разрешает короткое замыкание. Замыкание rhs не оценивается, если lhs ложно.)
Это довольно неловко (см. SR-944 , на который MartinR ссылается для небольшого количестваобсуждение этого вопроса).
Если бы bExpectedValue
были static
, или если бы он был перемещен за пределы определения класса, то это не было бы проблемой.Следующий подход также исправит это:
override init(a: String, b: String) {
let goodA = a == aExpectedValue
let goodB = b == bExpectedValue
c = goodA && goodB
super.init(a: a, b: b)
}