【问题标题】:How do you disambiguate between static methods from implemented protocols?您如何区分已实现协议的静态方法?
【发布时间】:2015-10-12 17:51:12
【问题描述】:

对于实例函数,强制转换工作得很好。

protocol Protocol1 {}
extension Protocol1 {
    func instanceFunc() {}
    static func staticFunc() {}
}

protocol Protocol2 {}
extension Protocol2 {
    func instanceFunc() {}
    static func staticFunc() {}
}

struct Struct: Protocol1, Protocol2 {
    func instanceFunc() {
        (self as Protocol1).instanceFunc()
        (self as Protocol2).instanceFunc()
    }

    static func staticFunc() {
        // My best guess. Nope!
        (Struct as Protocol1.Type).staticFunc()
        (Struct as Protocol2.Type).staticFunc()
    }
}

【问题讨论】:

  • 我知道,除了协议是否代表对象的接口,还是代表对象的某种个性,协议还有身份危机,但考虑到个性可以手动选择,例如函数,对于静态的任何东西都应该是一样的。
  • 我认为您错过了 Struct 不是对象的事实,但您正试图像它一样进行投射。在预期类型名称之后,您是否收到类似构造函数调用的错误?
  • 我不想像任何东西一样投射实例。我在猜测做我想做的事情的语法可能是什么。
  • 我的意思是你不需要强制转换你只需调用 Protocol1.staticFunc() 和 Protocol2.staticFunc() 因为它不是一个对象,它们是附加到类的静态函数。

标签: swift swift-protocols default-implementation


【解决方案1】:

这应该可以解决问题

protocol Protocol1 {}
extension Protocol1 {
    func instanceFunc() {}
    static func staticFunc() {}
}

protocol Protocol2 {}
extension Protocol2 {
    func instanceFunc() {}
    static func staticFunc() {}
}

struct Struct: Protocol1, Protocol2 {
    func instanceFunc() {
        (self as Protocol1).instanceFunc()
        (self as Protocol2).instanceFunc()
    }

    static func staticFunc() {
        (Struct.self as Protocol1.Type).staticFunc()
        (Struct.self as Protocol2.Type).staticFunc()
    }
}

【讨论】:

  • 我可以发誓我已经尝试过了;可能不会!做得好!你是谁?我想关注你的进展。
  • 很高兴我能帮上忙!不过,恐怕没有什么可遵循的,我只是想帮助这里的人们,偶尔也会在 swift 的 subreddit 上帮助他们。如果您需要什么,请给我发私信。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2023-03-13
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多