Как объявить функцию уровня класса в Swift?


Я не могу найти его в документах, и мне интересно, существует ли он в native Swift. Например, я могу вызвать функцию класса на NSTimer вот так:

NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: "someSelector:", userInfo: "someData", repeats: true)

но я не могу найти способ сделать это с моими пользовательскими объектами, чтобы я мог назвать это так:

MyCustomObject.someClassLevelFunction("someArg")

теперь я знаю, что мы можем смешивать Objective-C w / Swift, и возможно, что NSTimer метод класса является остатком от этой совместимости.

вопрос

  1. существуют ли функции уровня класса в Swift?

  2. если да, то как определить функцию уровня класса в Swift?

5 62

5 ответов:

Да, вы можете создавать функции класса следующим образом:

class func someTypeMethod() {
    //body
}

хотя в Swift они называются методами типа.

вы можете определить методы типа внутри класса с:

class Foo {
    class func Bar() -> String {
        return "Bar"
    }
}

затем получить к ним доступ из имени класса, т. е.:

Foo.Bar()

в Swift 2.0 вы можете использовать static ключевое слово, которое предотвратит переопределение подклассов метода. class позволит подклассы переопределить.

обновлено: благодаря @Logan

С Xcode 6 beta 5 Вы должны использовать static ключевое слово для структур и class ключевое слово для классов:

class Foo {
    class func Bar() -> String {
        return "Bar"
    }
}

struct Foo2 {
    static func Bar2() -> String {
        return "Bar2"
    }
}

С официальный Swift 2.1 Doc:

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

в struct, вы должны использовать static для определения метода типа. Для занятий вы можете использовать либо static или class ключевое слово, в зависимости от того, если вы хотите разрешить ваш метод переопределен подклассом или нет.

вам нужно определить метод в вашем классе

 class MyClass 
 {
       class func myString() -> String
       {
           return "Welcome"
       }
}

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

   MyClass.myString()

это приведет к "Добро пожаловать".