protocol SomeProtocol { var property : Int} extension UIVIEw : SomeProtocol { var property : Int { get { return 0 } set { // do nothing } } }@H_301_4@在一个具体的子类中,我想覆盖这个扩展方法:
class Subclass : UIVIEw,SomeProtocol { var _property : Int = 1 var property : Int { get { return _property} set(val) {_property = val} }}@H_301_4@我设置断点,看到扩展方法被调用,而不是具体的子类方法:
var subclassObject = Subclass()someObject.doSomethingWithConcreteSubclassObject(subclassObject)// other code;fun doSomethingWithConcreteSuclassObject(object : UIVIEw) { var value = object.property // always goes to extension class get/set}解决方法 作为 others have noted,Swift不允许您覆盖在类扩展中声明的方法.然而,我不知道你是否会得到你想要的行为,即使/当Swift有一天允许你覆盖这些方法. @H_301_4@考虑Swift如何处理协议和协议扩展.给出一个打印一些Metasyntactic变量名称的协议:
protocol Metasyntactic { func foo() -> String func bar() -> String}@H_301_4@提供默认实现的扩展:
extension Metasyntactic { func foo() -> String { return "foo" } func bar() -> String { return "bar" }}@H_301_4@还有一个符合协议的类:
class Foobar : Metasyntactic { func foo() -> String { return "FOO" } func bar() -> String { return "bar" }}@H_301_4@Swift将根据每个变量的运行时类型而不是由编译器推断的类型,使用动态调度来调用foo()和bar()的相应实现:
let a = Foobar()a.foo() // Prints "FOO"a.bar() // Prints "bar"let b: Metasyntactic = Foobar()b.foo() // Prints "FOO"b.bar() // Prints "bar"@H_301_4@但是,如果我们进一步扩展协议以添加新的方法:
extension Metasyntactic { func baz() -> String { return "baz" }}@H_301_4@如果我们在符合协议的类中覆盖我们的新方法:
class FoobarBaz : Metasyntactic { func foo() -> String { return "FOO" } func bar() -> String { return "bar" } func baz() -> String { return "BAZ" }}@H_301_4@Swift现在将根据编译器推断的类型使用静态调度来调用适当的baz()实现:
let a = FoobarBaz()a.baz() // Prints "BAZ"let b: Metasyntactic = FoobarBaz()b.baz() // Prints "baz"@H_301_4@Alexandros Salazar有a fantastic blog post explaining this behavior in depth,但足以说Swift只对原始协议中声明的方法使用动态调度,而不是在协议扩展中声明的方法.我想象同样的扩展类也是如此. 总结
以上是内存溢出为你收集整理的ios – Swift – 如何在一个具体的子类中覆盖一个扩展方法全部内容,希望文章能够帮你解决ios – Swift – 如何在一个具体的子类中覆盖一个扩展方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)