Swift在协议

时间:2015-05-14 09:34:38

标签: ios swift protocols static-methods class-method

我有以下困惑。据我所知,在声明方法时,静态关键字之间的主要区别在于可以在子类中重写第二个关键字。

问题

然而,当我在Swift 1.2中声明一个协议时:

protocol MyProtocol
{
    class func dummyClassMethod()
}

编译器发出错误:

  

只允许在类中使用类方法;使用'静态'声明   静态方法

该错误非常具有描述性,因为很明显MyProtocol不是一个类,但是我想将一个类func作为协议的一部分。

我尝试了什么

我发现如果我将协议中的接口声明为 static ,编译器很高兴我可以在采用此协议的所有类中使用此静态方法:

protocol MyProtocol
{
    static func dummyClassMethod()
}

问题

所以我的问题基本上就是这样吗?这个声明声明我的类方法不能在子节点中重写,但是在我的实现中我可以编写并使用以下内容:

class ClassA: MyProtocol
{
    class func dummyClassMethod() {

    }
}

class ClassB: ClassA
{
    override class func dummyClassMethod() {

    }
}

现在我的dummyClassMethod不再是静态的......

  1. 编译器正常,一切正常 - 但为什么?

  2. 然而,它是否特定于接口本身是静态的这一事实         它的实施不是吗?

  3. 协议中的类func是否有更好的替代方案?
  4. Objective-C解决方案

    在ObjC中,这很简单,编译和编译完美无缺地运行:

    @protocol MyProtocol 
    
    +(void)dummyClassMethod;
    
    @end
    

3 个答案:

答案 0 :(得分:28)

您可以查看Apple's Documentation方法要求小节)。

说:

  

与类型属性要求一样,在协议中定义类型方法要求时,始终使用 static 关键字作为前缀。即使类型方法要求在由类实现时以静态关键字作为前缀

,也是如此

在实践中,您可以按照以下方式执行此操作:

首先,宣布您的协议:

protocol SomeProtocol {
    static func someMethod()
}

然后,在class 2个选项中

<强>首先

class SomeClass : SomeProtocol {
    class func someMethod()
}

<强>第二

class SomeClass : SomeProtocol {
    static func someMethod()
}

我希望,这可能会澄清你的怀疑......

答案 1 :(得分:2)

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

  

协议定义了方法,属性等的蓝图   适合特定任务或功能的要求。    该协议实际上并未提供任何实现   这些要求 - 它只描述了实现的外观   喜欢。 然后协议可以被类,结构或者采用   枚举以提供这些要求的实际实现。

在此协议定义之后,

是合理的
  

与type属性要求一样,您始终使用type方法作为前缀   静态关键字在a中定义时的要求   协议。即使类型方法要求如此,也是如此   在由类实现时以类或静态关键字为前缀...

答案 2 :(得分:1)

使协议方法静态,最后用静态关键字

实现该方法
class ClassA: MyProtocol{

    static func dummyClassMethod() {

    }
} 

现在你不能再覆盖dummyClassMethod函数了。如果要防止覆盖,则必须将协议方法声明为final。关于类函数,它们在Swift 1.0中并不完全支持,现在在Swift 1.2中我认为它们正朝着静态函数方向发展