2014-12-19 4 views
0

Мне было интересно, почему вы не можете использовать ключевое слово static в классе. Я знаю, что вы можете использовать его в struct, но не в class
Кто-нибудь знает, почему они выбирают для этого? И если да, то есть ли какие-либо преимущества в предоставлении static?В чем причина использования статических методов/переменных в классе

ответ

6

Это терминология bêtise. Что Apple сделала, так это то, что вы используете static в перечислении или структуре и class в классе. На мой взгляд, это было очень глупое решение, поскольку они точно параллельны друг другу. Многие люди размещают на форумах разработчиков, предлагая им просто называть их static.

Результат является кандидатом на Бритву Оккама: две фразы, например. статическое свойство и свойство класса, или статический метод и метод класса, которые означают одно и то же. И затем они пытаются покрыть свои треки в документации, добавив третий термин в качестве зонтика, «свойство типа» (что означает свойство static-or-class) или «метод типа» (что означает метод «статический или класс») что только ухудшает ситуацию.

Неполадка ситуации также раскрывается тем, что вы должны делать в протоколах: вы объявляете свойство class в протоколе, а затем, если структура принимает его, он называет это свойство static. То же самое с методом class в протоколе; принимающая структура должна называть это методом static. Вы могли бы подумать, что это одно могло бы сказать им, что они сделали что-то плохое.

Редактировать: Чем больше я думаю об этом, тем больше мне нравится предложение, высказанное newacct в комментарии ниже. Если бы Apple просто использовала ключевое слово зонтика type здесь как часть языка, вся проблема была бы решена. У нас могли бы быть объявления type var, type let, type func, и это будет одинаково работать в перечислениях, структурах, классах и протоколах по всей доске.

+1

Up чисто голосования за bêtise – jrturton

+1

Что делать Я получаю за использование _bêtise_ и Occam's Razor в том же сообщении? Я смотрю на улицу для грузовика MacArthur Genius Grant, но, похоже, это не идет!:) – matt

+0

«статическое свойство и свойство класса, или статический метод и метод класса, которые означают одно и то же». Они не означают одно и то же. Для вызовов статических методов и статических свойств, который вызывается, всегда определяется * статически * (т. Е. Фиксируется во время компиляции). С другой стороны, существует * динамический * lookup (какой метод вызывается во время выполнения) для методов класса и свойств класса. – newacct

1

От Swift Language Guide on Methods Apple решила дифференцировать используемый синтаксис, основываясь на базовом типе, который вы строите.

Классы объявляют «Методы типа» с ключевым словом Class. Пример:

class MyClass { 
    class func myFunc(){ ... } 
} 

структур объявить "Тип" Методы с ключевым словом Static. Пример:

struct MyStruct { 
    static func myFunc(){ ... } 
} 

В обоих случаях в тару Тип Метод позволяет вызывать метод без создания экземпляра класса или структуры.

В то время как не класс/статическая функция будет требовать что-то вроде

let instance = MyClass() 
instance.myFunc() 

... объявить переменную как Тип Метод позволяет что-то вроде MyClass.myFunc()

Смежные вопросы