如何在 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
来定义类型方法。对于类,您可以使用static
或class
关键字,具体取决于您是否希望您的方法被子类覆盖。
【讨论】:
【参考方案5】:你需要在你的类中定义方法
class MyClass
class func myString() -> String
return "Welcome"
现在您可以使用类名来访问它,例如:
MyClass.myString()
这将导致“欢迎”。
【讨论】:
以上是关于如何在 Swift 中声明类级函数?的主要内容,如果未能解决你的问题,请参考以下文章
在Swift中,如何声明键是函数的字典? (不符合协议'Hashable')
如何检查在 swift 中声明的 UnsafeMutablePointer<ObjCBool> 类型的变量的值? [复制]