Я вижу эти определения в библиотеке Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
В чем разница между функцией-членом, определенной static func
и другой, как class func
? Это просто static
для статических функций структур и перечислений, а также class
для классов и протоколов? Есть ли другие отличия, о которых нужно знать? В чем смысл такого различия в самом синтаксисе?
class func
? С информацией, которой мы располагаем сейчас, это различие кажется довольно бесполезным, не так ли?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Ответы:
Это главное отличие. Некоторые другие различия заключаются в том, что функции класса отправляются динамически и могут быть переопределены подклассами.
Протоколы используют ключевое слово class, но оно не исключает структур из реализации протокола, они просто используют static. Класс был выбран для протоколов, поэтому не должно быть третьего ключевого слова для представления статического или класса.
От Криса Латтнера на эту тему:
А вот фрагмент кода, демонстрирующий некоторые переопределенные функции функций класса:
источник
static func myFunc()
вместоclass func myFunc
вас, вы получите следующую ошибку l: не может переопределить статический метод . Зачем? Потому что это как если бы оно было отмеченоfinal
. Чтобы получить больше информации. Смотрите следующий ответ ниже. Такжеx.dynamicType
теперь был заменен наtype(of:x)
Чтобы быть более ясным, я приведу пример здесь,
static func
такой же какfinal class func
Поскольку это так
final
, мы не можем переопределить его в подклассе, как показано ниже:источник
class func
отличается от обычного,func
хотя оба могут быть отменены. Ноfunc
это для экземпляра / объекта иclass func
могут быть доступны через класс, какClassA.classFunc()
Я провел несколько экспериментов на детской площадке и получил некоторые выводы.
TL; DR
Как вы можете видеть, в случае
class
использованияclass func
илиstatic func
это просто вопрос привычки.Пример детской площадки с объяснением:
источник
class
функций или статическое связываниеstatic
их.class func
перезаписывается?class func
переопределяется Я бы проголосовал за это иначе; люблю исследования и пример!Источник: Язык программирования Swift - Тип Переменные Свойства
источник
Согласно Книге Swift 2.2, изданной Apple:
«Вы указываете методы типа, написав
static
ключевое слово перед ключевым словом func метода. Классы также могут использоватьclass
ключевое слово, чтобы подклассы могли переопределить реализацию этого метода суперклассом » .источник
От Swift2.0 Apple говорит:
«Всегда определяйте префиксные требования к свойству типа при помощи ключевого слова static, когда вы определяете их в протоколе. Это правило имеет место, даже если требования к свойствам типа могут быть добавлены с префиксом class или static при реализации классом:»
источник
Этот пример прояснит каждый аспект!
Вывод:
источник
Это называется типом методов и вызывается с точечным синтаксисом, как методы экземпляра. Однако вы вызываете методы типа для типа, а не для экземпляра этого типа. Вот как вы вызываете метод типа для класса SomeClass:
источник
static
иclass
ключевыми словами.