如何以通用方式在协议上调用静态函数?

鲁珀特三世

是否有必要在协议上声明静态函数?无论如何,使用该协议的客户端必须在符合该协议的类型上调用该函数,对吗?这打破了不必知道符合协议IMO的类型的想法。有没有一种方法可以在我不必知道符合协议实际类型的方式下调用协议上的静态函数?

卢卡·安吉莱蒂

好问题。这是我的拙见:

是否有必要在协议上声明静态函数?

与在协议中声明实例方法几乎相同。

无论如何,使用该协议的客户端必须在符合该协议的类型上调用该函数,对吗?

是的,与实例函数完全一样。

这打破了不必知道符合协议IMO的类型的想法。

不。看下面的代码:

protocol Feline {
    var name: String { get }
    static func createRandomFeline() -> Feline
    init()
}

extension Feline {
    static func createRandomFeline() -> Feline {
        return arc4random_uniform(2) > 0 ? Tiger() : Leopard()
    }
}

class Tiger: Feline {
    let name = "Tiger"
    required init() {}
}

class Leopard: Feline {
    let name = "Leopard"
    required init() {}
}

let feline: Feline = arc4random_uniform(2) > 0 ? Tiger() : Leopard()
let anotherFeline = feline.dynamicType.createRandomFeline()

我不知道变量中的真实类型feline我只知道它确实符合Feline但是,我正在调用静态协议方法。

有一个更好的方法吗?

我知道,您想调用协议中声明的静态方法/函数,而无需创建符合协议的值。

像这样:

Feline.createRandomFeline() // DANGER: compiler is not happy now

老实说,我不知道为什么这不可能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章