Swift覆盖类函数

7

在 Swift 中覆盖一个方法非常容易:

class A {
   func innerValue() -> Int { return 5 }
   func getInnerValue() -> Int { return innerValue() }
}

class B: A {
   override func innerValue() -> Int { return 8 }
}

B().getInnerValue() //returns 8

但是,当我使用class关键字将innerValue()声明为静态时,我不知道如何做到这一点:

class A {
   class func innerValue() -> Int { return 5 }
   func getInnerValue() -> Int {
      return A.innerValue() //ok for compiler but returns 5 instead of 8
      return self.innerValue() //error: 'A' doesn't have a member named 'innerValue'
      return innerValue() //error: Use of unresolved identifier 'innerValue'
   }
}

class B: A {
   override class func innerValue() -> Int { return 8 }
}

B().getInnerValue()

那么在Swift中是否可能呢?
1个回答

9
return A.innerValue() //ok for compiler but returns 5 instead of 8

从您的评论中可以看出,您想要做的是以多态的方式引用当前实例的类。如果是这样,就不要向A发送innerValue()消息;这意味着只有A。也不要将其发送给self,因为按照您编写的方式,getInnerValue是一个实例方法,而您想要调用的是一个类方法。将其发送到self.dynamicType,即当前实例的类。

请参阅我的Swift书籍中关于此主题的讨论:http://www.apeth.com/swiftBook/ch04.html#_type_reference - matt
请注意,如果 getInnerValue 是一个类方法,那么 self 就是正确的目标。 - matt
2
在 Swift 3 中,self.dynamicType 已经变成了 type(of: self) - BallpointBen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接