以下代码显示了A类,它是B类的超类。该函数具有返回类型' Self'。 B类中重写的方法会出错(请参阅注释)。
class A {
class func doSomething(param1: String) -> Self {
var entity = self()
// Some code goes here...
return entity
}
}
class B: A {
override class func doSomething(param1: String) -> Self {
var entity = super.doSomething(param1) as! B
// Some code goes here...
return entity // Error:'B' is not convertible to 'Self'
}
}
如果我在Objective-C中使用了instanceType,它会起作用。那我该怎么做呢?或者那是不可能的?
我想让方法成为当前重写类的返回类型。 解决方法是使用init-method接受超类类型作为参数。
这提出了另一个问题:当前类的对象是否等于self()?
那么
之间有什么区别var entity = someObject as! B
和
var entity = self() // Current class / file is B
class func objectCast<T: A>(obj: A) -> T {
return obj as! T
}
返回objectCast(实体)而不是实体工作。
class A {
class func doSomething(param1: String) -> Self {
var entity = self()
// Some code goes here...
return entity
}
}
class B: A {
override class func doSomething(param1: String) -> Self {
var entity = super.doSomething(param1) as! B
// Some code goes here...
return objectCast(entity) // No error.
}
}
所以...为什么它需要这个技巧,似乎我在理解“自我”的含义时遇到了问题。任何人都可以回答我关于差异的问题的第二部分吗?
答案 0 :(得分:0)
关于你的第二个问题,区别在于第一个选项将在任何子类中返回B,因此子类不会返回Self,而第二个选项将在任何子类中返回Self的实体。如果你把B类标记为最终,那么这两种方法都会有效。