我有以下困惑。据我所知,在声明方法时,static和class关键字之间的主要区别在于第二个关键字可以在子类中重写
问题
但是,当我在Swift 1.2中声明协议时,如下所示:
协议MyProtocol
{
类func dummyClassMethod()
}
编译器给出一个错误:
类方法只允许在类内使用;使用“static”来声明
静态方法
这个错误非常具有描述性,因为MyProtocol显然不是一个类,但是我想让一个类func成为协议的一部分
我尝试过的
我发现,如果我在协议中将接口声明为static,编译器会很高兴,并且我可以在采用此协议的所有类中使用此static方法:
协议MyProtocol
{
静态func dummyClassMethod()
}
问题
所以我的问题基本上是这是对的吗?此声明声明我的类方法不能在子类中重写,但是在我的实现中,我可以编写并使用以下内容:
A类:MyProtocol
{
类func dummyClassMethod(){
}
}
B类:A类
{
重写类func dummyClassMethod(){
}
}
现在我的dummyClassMethod不再是静态的
-
编译器是正常的,一切正常-但为什么
-
然而,它是否特定于接口本身是静态的这一事实
它的实现不是吗 - 协议中的类func有更好的替代方案吗
目标C解决方案
在ObjC中,这非常容易编译&;完美运行:
@协议MyProtocol
+(无效)Dummy方法;
@结束
您可以查看苹果的文档(小节方法要求)
有人说:
与类型属性要求一样,当在协议中定义类型方法要求时,始终使用static关键字作为它们的前缀。即使类型方法要求在由类实现时以类或静态关键字作为前缀,也是如此
在实践中,您可以按如下方式执行:
首先,声明您的协议:
协议{
静态func方法()
}
然后,在您的课程中
有两个选项:
第一名:
类SomeClass:SomeProtocol{
类func someMethod()
}
秒:
类SomeClass:SomeProtocol{
静态func方法()
}
我希望这能澄清你的疑问