我有以下困惑。据我所知,在声明方法时,静态和类关键字之间的主要区别在于可以在子类中重写第二个关键字。
问题
然而,当我在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不再是静态的......
编译器正常,一切正常 - 但为什么?
然而,它是否特定于接口本身是静态的这一事实 它的实施不是吗?
Objective-C解决方案
在ObjC中,这很简单,编译和编译完美无缺地运行:
@protocol MyProtocol
+(void)dummyClassMethod;
@end
答案 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)
协议定义了方法,属性等的蓝图 适合特定任务或功能的要求。 该协议实际上并未提供任何实现 这些要求 - 它只描述了实现的外观 喜欢。 然后协议可以被类,结构或者采用 枚举以提供这些要求的实际实现。
在此协议定义之后,
是合理的与type属性要求一样,您始终使用type方法作为前缀 静态关键字在a中定义时的要求 协议。即使类型方法要求如此,也是如此 在由类实现时以类或静态关键字为前缀...
答案 2 :(得分:1)
使协议方法静态,最后用静态关键字
实现该方法class ClassA: MyProtocol{
static func dummyClassMethod() {
}
}
现在你不能再覆盖dummyClassMethod函数了。如果要防止覆盖,则必须将协议方法声明为final。关于类函数,它们在Swift 1.0中并不完全支持,现在在Swift 1.2中我认为它们正朝着静态函数方向发展