如何在 Swift 中声明类级函数?

Posted

技术标签:

【中文标题】如何在 Swift 中声明类级函数?【英文标题】:How do I declare a class level function in Swift? 【发布时间】:2014-07-23 08:47:44 【问题描述】:

我似乎在文档中找不到它,我想知道它是否存在于原生 Swift 中。例如,我可以像这样在NSTimer 上调用类级函数:

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

但我似乎找不到使用自定义对象的方法,因此我可以这样称呼它:

MyCustomObject.someClassLevelFunction("someArg")

现在,我知道我们可以将 Objective-C 与 Swift 混合使用,NSTimer 类方法可能是这种互操作性的残余。

问题

    Swift 中是否存在类级函数?

    如果是,如何在 Swift 中定义类级函数?

【问题讨论】:

class func functionName() -> returnType 顺便说一句,您可以检查现有的框架类以找到答案,例如NSNotificationCenter 类的defaultCenter() 方法。 @NSUInteger - 我只是在寻找 Objective-C 头文件。你能给我指点 NSNotificationCenter.swift 吗? 好的。尝试这个。在代码中输入 NSNotificationCenter.defaultCenter() 然后使用 Command+click 导航到 swift 文件 @nsuinteger -- 谢谢,我是点击选项,它只带我到 ObjC 标题。 很高兴你把它整理出来。可选择安装 ios8 库和 xcode 库,这样您也将拥有文档(如果尚未完成)。 xcode > 首选项 > 下载 > ios8 库和 xcode6 库。 【参考方案1】:

是的,你可以像这样创建类函数:

class func someTypeMethod() 
    //body

虽然在 Swift 中,它们被称为类型方法。

【讨论】:

如何在这些类型方法之一中使用类变量而不获取<object>.type does not have a member named <class var>【参考方案2】:

你可以在你的类中定义类型方法:

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

然后从类名中访问它们,即:

Foo.Bar()

在 Swift 2.0 中,您可以使用 static 关键字来防止子类覆盖该方法。 class 将允许子类覆盖。

【讨论】:

【参考方案3】:

更新:感谢@Logan

在 Xcode 6 beta 5 中,您应该使用 static 关键字来表示结构,使用 class 关键字来表示类:

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


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

【讨论】:

你确定吗,这甚至不能编译,它建议用class 替换static。我在 Xcode 6 beta 5 上(这就是我假设你的意思)。 @Logan 我的静态函数在类扩展中,我会再次检查。 您确定要扩展 class 而不是 struct @Logan 是的,你是对的!谢谢,我已经解决了 在每一种基于 c 的语言(c#、java、..)中都使用静态关键字【参考方案4】:

来自official Swift 2.1 Doc:

通过在方法的 func 关键字之前写 static 关键字来指示类型方法。类也可以使用 class 关键字来允许子类覆盖超类对该方法的实现。

在结构体中,必须使用static 来定义类型方法。对于类,您可以使用staticclass 关键字,具体取决于您是否希望您的方法被子类覆盖。

【讨论】:

【参考方案5】:

你需要在你的类中定义方法

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

现在您可以使用类名来访问它,例如:

   MyClass.myString()

这将导致“欢迎”。

【讨论】:

以上是关于如何在 Swift 中声明类级函数?的主要内容,如果未能解决你的问题,请参考以下文章

在Swift中,如何声明键是函数的字典? (不符合协议'Hashable')

如何在 swift 中声明一个“受保护”变量

如何在Swift中声明计算属性'throws'?

如何在 Swift 中声明、创建和使用方法指针?

如何在 Swift 2.2 中编写这些函数?

如何检查在 swift 中声明的 UnsafeMutablePointer<ObjCBool​​> 类型的变量的值? [复制]