Swift - разное между ключевым словом static и ключевым словом class [duplicate]

Короткий ответ: вам нужно выполнить обратный вызов следующим образом:

function callback(response) {
    // Here you can do what ever you want with the response object.
    console.log(response);
}

$.ajax({
    url: "...",
    success: callback
});
242
задан Jean-Philippe Pellet 3 February 2015 в 09:11
поделиться

7 ответов

Это просто, что static является для статических функций структур и перечислений, а класс для классов и протоколов?

Это основное отличие. Некоторые другие отличия заключаются в том, что функции класса динамически отправляются и могут быть переопределены подклассами.

Протоколы используют ключевое слово класса, но это не исключает, что структуры реализуют протокол, вместо этого они используют статический. Класс был выбран для протоколов, поэтому для представления статического или класса не должно быть третьего ключевого слова.

От Chris Lattner по этой теме:

Мы рассмотрели вопрос об объединении синтаксис (например, использование «type» в качестве ключевого слова), но на самом деле это не просто вещи. Ключевые слова «класс» и «статические» хороши для ознакомления и достаточно описательны (как только вы понимаете, как работают + методы), и откройте дверь для потенциального добавления действительно статических методов в классы. Основная странность этой модели заключается в том, что протоколы должны выбирать ключевое слово (и мы выбрали «класс»), но на балансе это правильный компромисс.

И вот фрагмент, который показывает некоторые поведения переопределения функций класса:

class MyClass {
    class func myFunc() {
        println("myClass")
    }
}

class MyOtherClass: MyClass {
    override class func myFunc() {
        println("myOtherClass")
    }
}

var x: MyClass = MyOtherClass()
x.dynamicType.myFunc() //myOtherClass
x = MyClass()
x.dynamicType.myFunc() //myClass
156
ответ дан mcknut 24 August 2018 в 19:07
поделиться

Из Swift2.0 Apple говорит:

«Всегда задавать свойства типа префикса со статическим ключевым словом, когда вы определяете их в протоколе. Это правило относится даже к тому, что требования к свойствам типа могут иметь префикс класса или статическое ключевое слово при реализации классом: «

8
ответ дан Jacky 24 August 2018 в 19:07
поделиться

Чтобы быть более ясным, я приведу здесь пример,

class ClassA {
  class func func1() -> String {
    return "func1"
  }

  static func func2() -> String {
    return "func2"
  }

  /* same as above
  final class func func2() -> String {
    return "func2"
  }
  */
}

static func такой же, как final class func

Поскольку он final, мы не можем переопределить это в подклассе, как показано ниже:

class ClassB : ClassA {
  override class func func1() -> String {
    return "func1 in ClassB"
  }

  // ERROR: Class method overrides a 'final` class method
  override static func func2() -> String {
    return "func2 in ClassB"
  }
}
128
ответ дан Jake Lin 24 August 2018 в 19:07
поделиться

основное отличие состоит в том, что структуры являются типами значений, а классы являются ссылочными типами.

Когда вы создаете копию типа значения, она копирует все данные из вещи, которую вы копируете в новую переменную , Они являются 2 отдельными вещами, а изменение одного не влияет на другие

. Когда вы делаете копию ссылочного типа, новая переменная относится к тому же месту памяти, что и копируемая вещь. Это означает, что изменение одного изменит другое, поскольку оба они относятся к одному и тому же местоположению памяти

-5
ответ дан John Tai 24 August 2018 в 19:07
поделиться

Согласно книге Swift 2.2, опубликованной apple:

«Вы указываете методы типа, написав ключевое слово static до ключевого слова func метода. Классы также могут использовать ключевое слово class, чтобы позволить подклассам переопределять реализацию суперкласса этого метода. "

10
ответ дан Milad 24 August 2018 в 19:07
поделиться

Чтобы объявить свойство переменной типа, пометьте объявление с помощью модификатора объявления static. Классы могут отмечать присвоенные значения свойства с помощью модификатора объявления class вместо этого, чтобы позволить подклассам переопределять реализацию суперкласса. Свойства типа обсуждаются в свойствах типа.

ПРИМЕЧАНИЕ В объявлении класса ключевое слово static имеет тот же эффект, что и обозначение объявления как с помощью class и final.

Источник: Язык Swift для программирования - Свойства переменной типа

48
ответ дан NexD. 24 August 2018 в 19:07
поделиться

Я сделал несколько экспериментов на детской площадке и сделал некоторые выводы.

TL; DR

Как вы можете видеть, в случае class , использование class func или static func является лишь вопросом привычки.

Пример игровой площадки с объяснением:

class Dog {
    final func identity() -> String {
        return "Once a woofer, forever a woofer!"
    }

    class func talk() -> String {
        return "Woof woof!"
    }

    static func eat() -> String {
        return "Miam miam"
    }

    func sleep() -> String {
        return "Zzz"
    }
}

class Bulldog: Dog {
    // Can not override a final function
//    override final func identity() -> String {
//        return "I'm once a dog but now I'm a cat"
//    }

    // Can not override a "class func", but redeclare is ok
    func talk() -> String {
        return "I'm a bulldog, and I don't woof."
    }

    // Same as "class func"
    func eat() -> String {
        return "I'm a bulldog, and I don't eat."
    }

    // Normal function can be overridden
    override func sleep() -> String {
        return "I'm a bulldog, and I don't sleep."
    }
}

let dog = Dog()
let bullDog = Bulldog()

// FINAL FUNC
//print(Dog.identity()) // compile error
print(dog.identity()) // print "Once a woofer, forever a woofer!"
//print(Bulldog.identity()) // compile error
print(bullDog.identity()) // print "Once a woofer, forever a woofer!"

// => "final func" is just a "normal" one but prevented to be overridden nor redeclared by subclasses.


// CLASS FUNC
print(Dog.talk()) // print "Woof woof!", called directly from class
//print(dog.talk()) // compile error cause "class func" is meant to be called directly from class, not an instance.
print(Bulldog.talk()) // print "Woof woof!" cause it's called from Bulldog class, not bullDog instance.
print(bullDog.talk()) // print "I'm a bulldog, and I don't woof." cause talk() is redeclared and it's called from bullDig instance

// => "class func" is like a "static" one, must be called directly from class or subclassed, can be redeclared but NOT meant to be overridden.

// STATIC FUNC
print(Dog.eat()) // print "Miam miam"
//print(dog.eat()) // compile error cause "static func" is type method
print(Bulldog.eat()) // print "Miam miam"
print(bullDog.eat()) // print "I'm a bulldog, and I don't eat."

// NORMAL FUNC
//print(Dog.sleep()) // compile error
print(dog.sleep()) // print "Zzz"
//print(Bulldog.sleep()) // compile error
print(bullDog.sleep()) // print "I'm a bulldog, and I don't sleep."
54
ответ дан Nhon Nguyen 24 August 2018 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: