Это на самом деле не ограничивается Swift. Это сломало бы полиморфизм. См. Правила подтипов в википедии: Подтип
В основном рассмотрим следующий пример:
class A {
var x: NSObject?
}
class B: A {
override var x: NSNumber?
}
и рассмотрим:
let b = B(x: 1)
let a: A = b // it's a subclass, polymorphism allows to assign it to A
a.x = NSObject() // let's assign NSObject() because A.x takes NSObject
print(b.x) // b.x should be a NSNumber now but we have assigned a NSObject?
Вы должны понимать, что свойство представляет собой комбинацию двух функций: установщика и получателя. Вы можете добавить более конкретный тип (ковариантный тип) к получателю (возвращаемое значение функции), но вы не можете сделать это для установщика (параметры переопределяемой функции требуют контрастности).
Это также говорит о том, что это будет работать со свойством только для чтения:
class A {
var x: NSObject? {
return NSObject()
}
}
class B: A {
override var x: NSNumber? {
return NSNumber()
}
}