Статические функции/переменные класса vs в классах Swift?
следующий код компилируется в Swift 1.2:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
в чем разница между статический
7 ответов:
staticиclassКак связать метод с классом, а не экземпляром класса. Разница в том, что подклассы могут переопределятьclassметоды; они не могут переопределитьstaticметоды.
classсвойства теоретически будут функционировать таким же образом (подклассы могут переопределять их), но они пока невозможны в Swift.
Я попытался ответить и комментарии mipadi на детской площадке. И мысли о нем. Вот, держи. Я думаю, что ответ mipadi следует отметить, как принято.
class A{ class func classFunction(){ } static func staticFunction(){ } class func classFunctionToBeMakeFinalInImmediateSubclass(){ } } class B: A { override class func classFunction(){ } //Compile Error. Class method overrides a 'final' class method override static func staticFunction(){ } //Lets avoid the function called 'classFunctionToBeMakeFinalInImmediateSubclass' being overriden by subclasses /* First way of doing it override static func classFunctionToBeMakeFinalInImmediateSubclass(){ } */ // Second way of doing the same override final class func classFunctionToBeMakeFinalInImmediateSubclass(){ } //To use static or final class is choice of style. //As mipadi suggests I would use. static at super class. and final class to cut off further overrides by a subclass } class C: B{ //Compile Error. Class method overrides a 'final' class method override static func classFunctionToBeMakeFinalInImmediateSubclass(){ } }
в отношении ОП, ответ слишком прост:
подклассы могут переопределить класс методы, но не может переопределить статический методы.
В дополнение к вашему посту, если вы хотите объявить класс переменная (как вы сделали
class var myVar2 = ""), вы должны сделать это следующим образом:class var myVar2: String { return "whatever you want" }
я получил эту путаницу в одном из моих проектов, а также и нашла этот пост, очень полезно. Пробовал то же самое на моей игровой площадке, и вот резюме. Надеюсь, это поможет кому-то с сохраненными свойствами и функциями типа
static,final,class, переопределение класса vars и др.class Simple { init() {print("init method called in base")} class func one() {print("class - one()")} class func two() {print("class - two()")} static func staticOne() {print("staticOne()")} static func staticTwo() {print("staticTwo()")} final func yesFinal() {print("yesFinal()")} static var myStaticVar = "static var in base" //Class stored properties not yet supported in classes; did you mean 'static'? class var myClassVar1 = "class var1" //This works fine class var myClassVar: String { return "class var in base" } } class SubSimple: Simple { //Successful override override class func one() { print("subClass - one()") } //Successful override override class func two () { print("subClass - two()") } //Error: Class method overrides a 'final' class method override static func staticOne() { } //error: Instance method overrides a 'final' instance method override final func yesFinal() { } //Works fine override class var myClassVar: String { return "class var in subclass" } }а вот тестовые образцы:
print(Simple.one()) print(Simple.two()) print(Simple.staticOne()) print(Simple.staticTwo()) print(Simple.yesFinal(Simple())) print(SubSimple.one()) print(Simple.myStaticVar) print(Simple.myClassVar) print(SubSimple.myClassVar) //Output class - one() class - two() staticOne() staticTwo() init method called in base (Function) subClass - one() static var in base class var in base class var in subclass
тестирование в Swift 4 показывает разницу в производительности в симуляторе. Я сделал класс С " class func "и struct с" static func " и запустил их в тесте.
статическая функция:
- 20% быстрее без оптимизации компилятора
- 38% быстрее, когда оптимизация -весь-модуль-оптимизация включена.
однако запуск того же кода на iPhone 7 под iOS 10.3 показывает точно такую же производительность.
вот пример проекта в Swift 4 для Xcode 9, Если вы хотите проверить себя https://github.com/protyagov/StructVsClassPerformance
есть еще одно отличие.
classможет использоваться для определения свойств типа только вычисляемый тип. Если вам нужен сохраненное свойство типа использоватьstaticвместо.
добавление к вышеприведенным ответам статические методы являются статической отправкой означает, что компилятор знает, какой метод будет выполняться во время выполнения, поскольку статический метод не может быть переопределен, а метод класса может быть динамической отправкой, поскольку подкласс может переопределить их.
Comments