Следующий код компилируется в Swift 1.2:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
В чем разница между статическим функцией и функцией класса ? Какой я должен использовать и когда?
Если я попытаюсь определить другую переменную class var myVar2 = ""
, он говорит:
Свойства классов, которые еще не поддерживаются в классах; Вы имели в виду «статический»?
Когда эта функция поддерживается, какова будет разница между статической переменной и переменной класса (т. Е. Когда они оба определены в классе)? Какой я должен использовать и когда?
(Xcode 6.3)
Ответы:
static
иclass
оба ассоциируют метод с классом, а не с экземпляром класса. Разница в том, что подклассы могут переопределятьclass
методы; они не могут переопределятьstatic
методы.class
свойства теоретически будут функционировать одинаково (подклассы могут их переопределять), но в Swift это пока невозможно.источник
final class
функцией и «статической» функцией в классе?final
может использоваться для отключения дальнейших переопределений при использовании в подклассе. Оба имеют свое место, я бы сказал, использованиеstatic
илиfinal
когда используется в функции класса тривиально и зависит от вашего выбора стиля.static func foo(){}
в Swift это какpublic static final foo(){}
в Java?Я попробовал ответ и комментарии Мипади на детской площадке. И думал поделиться этим. Ну вот. Я думаю, что ответ Мипади должен быть отмечен как принятый.
источник
Относительно ООП , ответ слишком прост:
Подклассы могут переопределять методы класса , но не могут переопределять статические методы.
В дополнение к вашему сообщению, если вы хотите объявить переменную класса (как вы это сделали
class var myVar2 = ""
), вы должны сделать это следующим образом:источник
Я также запутался в одном из моих проектов и нашел этот пост очень полезным. Попробовал то же самое на моей игровой площадке и вот резюме. Надеюсь , что это помогает кто - то с хранящимися свойствами и функциями типа
static
,final
,class
, перекрывая класс VARS и т.д.А вот и тестовые образцы:
источник
Тестирование в Swift 4 показывает разницу в производительности симулятора. Я создал класс с "class func" и struct с "static func" и запустил их в тесте.
Статическая функция это:
Тем не менее, запуск того же кода на iPhone 7 под iOS 10.3 показывает точно такую же производительность.
Вот пример проекта в Swift 4 для Xcode 9, если вы хотите проверить себя https://github.com/protyagov/StructVsClassPerformance
источник
Есть еще одно отличие.
class
может использоваться для определения свойств типа только для вычисляемого типа . Если вам нужно свойство сохраненного типа, используйтеstatic
вместо этого.«Вы определяете свойства типов с помощью ключевого слова static. Для вычисляемых свойств типов для типов классов вместо этого можно использовать ключевое слово class, чтобы подклассы могли переопределить реализацию суперкласса».
источник
Добавление к вышеупомянутым ответам статических методов - статическая диспетчеризация - означает, что компилятор знает, какой метод будет выполнен во время выполнения, поскольку статический метод не может быть переопределен, в то время как метод класса может быть динамической диспетчеризацией, поскольку подкласс может переопределить их.
источник
Есть еще одно отличие. Класс может использоваться для определения свойств типа только для вычисляемого типа. Если вам нужно свойство сохраненного типа, используйте static.
Класс: - тип ссылки
структура: - тип значения
источник
class
используется внутриReference Type
(класс):static
используется внутриReference Type
иValue Type
(class, enum):[Ссылка против значения типа]
источник