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

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

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

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

MyCustomObject.someClassLevelFunction("someArg")

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

Вопрос

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

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

Ответ 1

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

class func someTypeMethod() {
    //body
}

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

Ответ 2

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

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

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

Foo.Bar()

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

Ответ 3

ОБНОВЛЕНО: @Logan

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

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

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

Ответ 4

Из официального документа Swift 2.1 Doc:

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

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

Ответ 5

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

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

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

   MyClass.MyString()

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