У меня была следующая путаница. Насколько я знаю, основное различие между ключевыми словами static и class при объявлении метода заключается в том, что второй может быть переопределен в подклассах.
Проблема
Однако, когда я объявляю протокол в Swift 1.2 следующим образом:
protocol MyProtocol
{
class func dummyClassMethod()
}
компилятор дает сообщение об ошибке:
Методы класса допускаются только внутри классов; использовать 'static' для объявления статический метод
Ошибка довольно описательная, поскольку, очевидно, MyProtocol не является классом, однако я хочу сделать часть func класса частью протокола.
Что я пробовал
Я обнаружил, что если объявить интерфейс в протоколе как static, компилятор будет счастлив, и я мог бы использовать этот статический метод во всех классах, которые принимают этот протокол:
protocol MyProtocol
{
static func dummyClassMethod()
}
Вопрос
Итак, мой вопрос в основном заключается в том, что это правильно? В этом объявлении указано, что мой метод класса не может быть переопределен у детей, однако в моей реализации я мог бы написать и использовать следующее:
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
и теперь мой dummyClassMethod больше не статичен...
-
Компилятор работает нормально, и все работает - но почему?
-
Является ли это специфическим для того факта, что сам интерфейс является статическим, однако это реализация не?
- Есть ли лучшая альтернатива для класса func в протоколах?
Objective-C решение
В ObjC это довольно просто и компилируется и выполняется безупречно:
@protocol MyProtocol
+(void)dummyClassMethod;
@end