重写最初在Obj-c超类中定义的swift类中的属性

重写最初在Obj-c超类中定义的swift类中的属性,swift,Swift,虽然我完全理解强类型实现的错误做法,但我有一些需要在子类中更改的通用代码。obj-c代码中的getter和setter处理id类型的值,因此它需要更多的泛化值 // objc @interface A @property NSNumber* foo; @end // swift subclass class B : A { var foo: String? } 是否要定义一个属性是Swift,以便它完全替换超类属性 Obj-c与(id)类型的松散类型特性允许一定的灵活性,这在swift

虽然我完全理解强类型实现的错误做法,但我有一些需要在子类中更改的通用代码。obj-c代码中的getter和setter处理id类型的值,因此它需要更多的泛化值

// objc
@interface A
@property NSNumber* foo;
@end

// swift subclass
class B : A {
   var foo: String?
}
是否要定义一个属性是Swift,以便它完全替换超类属性


Obj-c与(id)类型的松散类型特性允许一定的灵活性,这在swift中被关闭。

这是不可能的。您可以重写属性以提供不同的行为,但是更改类型会违反OO设计,因此不会编译

要替代属性,请执行以下操作:

override var foo: NSNumber! {
  get { return NSNumber(int: 5) }
  set { }
}
编辑:为什么会中断OO?

原因是,通过继承A,您承诺将像A一样行事。想象一下,如果您有这样一个函数,会发生什么:

func doStuff(obj: A) {
   print("Foo / 2: \(Float(obj.foo.integerValue) / 2.0)")
}
如果您试图在此处提交
B
的实例,会发生什么情况?在强类型编译语言中,这是无法调和的。在动态语言中,这将导致运行时错误

我还要提到:

可替换性是面向对象编程中的一个原则,它规定,在计算机程序中,如果S是T的子类型,则T类型的对象可以替换为S类型的对象(即,T类型的对象可以替换为S类型的子类型对象),而不改变该程序的任何期望属性(正确性、执行的任务等)


这更像是一个指导原则,它说你不应该仅仅因为你是子类而破坏在你的超类上操作的方法和过程的现有行为。但对于结构来说也是如此,它只是编译器强制执行这一点,而不是作为一个指导原则。

谢谢,只是一个查询,它会破坏OO设计吗?作为重写一个属性,这将打破继承链。与b.foo的任何交互都将是一个字符串,而a.foo将是一个数字。这些类仍然是强类型的,并且在这方面是类型安全的。(将注释移到我的答案中)很酷,谢谢你的帖子。我确实记得很久以前就研究过这个,但它似乎总是与其他类型的对象结构(如扩展)不一致。不管怎样,你已经回答了我的问题,谢谢,这正转向意识形态编程技术。