ios – Swift – 如何在一个具体的子类中覆盖一个扩展方法

ios – Swift – 如何在一个具体的子类中覆盖一个扩展方法,第1张

概述我有一个扩展UIView实现一个协议 protocol SomeProtocol { var property : Int} extension UIView : SomeProtocol { var property : Int { get { return 0 } set { // 我有一个扩展UIVIEw实现一个协议
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 – 如何在一个具体的子类中覆盖一个扩展方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1110366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存