协议类型的调用方法

问题描述:

我已经搜索了相当多的地方并在操场上玩过,但是我没有成功,所以我在这里问: 任何方法都要使变量包含非@objc协议元类型,然后调用类/从它的静态方法?协议类型的调用方法

例如为:

protocol MyProtocol { 
    class func myFunc() -> Int 
} 
enum MyEnum: Int, MyProtocol { 
    case A 
    case B 
    static func myFunc() -> Int { return A.rawValue } 
} 
let foo: MyProtocol.Type = MyEnum.self 
let bar = foo.myFunc() 

附:它说最后一次调用是未实现,所以我应该期待它在未来的Swift版本中?

+0

它现在在swift中实现2.0+ –

+0

[使swift类符合协议 - 在静态/类级别](http://*.com/questions/ 29711935/make-swift-class-conform-to-protocol-at-static-class-level) –

类方法只允许在类和协议中使用;枚举既不是。

类方法是Swift“类型方法”的一种类型;另一种类型是静态方法,这是你在枚举中声明的。类和静态方法是不同的。

请参阅the Swift methods docs了解几种不同的模式和示例。

p.s.它说上次调用未实现,那么我应该在未来的Swift版本中期待它吗?

是。

+1

我不明白。 'MyEnum'符合'MyProtocol'(否则它将是一个不同的编译错误),这意味着可以在类型对象上调用'myFunc'。以及如何在枚举类型上实现类方法? –

+0

_unimplemented_消息意味着Swift不实现此功能_not_方法未在该类型中实现。 –

+0

@BryanChen(1)如果在枚举中将'static'更改为'class',将会看到显式错误。 (2)你是对的;我误解了错误。我已经更新了我的答案。 –

更新的版本夫特2.0及以上

夫特2.0+允许方法将被声明为在协议定义静态的。这些必须满足实现协议的对象中的静态/类方法。

您无法使用静态方法满足实例方法的协议定义,反之亦然,这使得上述问题不完整。

如果您想尝试这只是使用关键字“静态”在协议定义的方法,你会实现你的符合对象为静态或类方法:

protocol InstanceVsStatic { 
    func someInstanceFunc() 
    static func someStaticFunc() 
} 

enum MyConformingEnum: InstanceVsStatic { 
    case someCase 

    static func someStaticFunc() { 
      // code 
    } 
    func someInstanceFunc() { 
     // code 
    } 
} 

class MyConformingClass: InstanceVsStatic { 
    class func someStaticFunc() { 
      // code 
    } 
    func someInstanceFunc() { 
     // code 
    } 
} 

struct MyConformingStruct: InstanceVsStatic { 
    static func someStaticFunc() { 
      // code 
    } 
    func someInstanceFunc() { 
     // code 
    } 
} 

你可以有一个实例方法调用静态/类方法:

这使您可以在需要符合需要实例方法的协议时执行静态代码。

struct MyConformingStruct: InstanceVsStatic { 
    static func doStuffStatically(){ 
     // code 
    } 

    static func someStaticFunc() { 
      // code 
    } 

    func someInstanceFunc() { 
     MyConformingStruct.doStuffStatically() 
    } 
} 

夫特1.2

比如上述间接其他,也没有办法来使用静态(类)方法以符合协议在1.2和低于纯迅速版本。这是一个已知的bug /未实现的功能:https://openradar.appspot.com/20119848