【问题标题】:How do I declare a class level function in Swift?如何在 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 类方法可能是这种互操作性的残余。

问题

  1. Swift 中是否存在类级函数?

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

【问题讨论】:

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

标签: swift


【解决方案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()
      

      这将导致“欢迎”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2016-06-06
        • 1970-01-01
        相关资源
        最近更新 更多