在Swift中初始化类的方法?

我正在寻找类似于Objective-C的+(void)initialize类方法的行为,因为该方法在类初始化时调用一次,之后再也不会再调用。

classclosures中的一个简单class init () {}将非常光滑! 很显然,当我们使用“ class var s”而不是“结构闭包中的static varvariables”时,这一切都将非常吻合!

如果你有一个Objective-C类,最简单的方法就是覆盖+initialize 。 但是,确保你的类的类也覆盖+initialize ,否则你的类的+initialize可能会不止一次地被调用! 如果你愿意,你可以使用dispatch_once() (下面提到)来防止多次调用。

 class MyView : UIView { override class func initialize () { // Do stuff } } 

如果你有一个Swift类,你可以在init()语句中获得最好的dispatch_once()

 private var once = dispatch_once_t() class MyObject { init () { dispatch_once(&once) { // Do stuff } } } 

这个解决scheme不同于+initialize (这是第一次被称为Objective-C类的消息),因此不是对这个问题的真实答案。 但是,它足够好,国际海事组织。

Swift中没有types初始值设定项

“与存储的实例属性不同,您必须始终将存储的types属性设置为默认值。 这是因为types本身没有初始化程序 ,可以在初始化时将值赋给存储的types属性。“

摘录自:苹果公司“Swift编程语言”, iBooks 。


你可以使用一个默认值是闭包的types属性 。 所以当设置了types属性 (或类variables)时,将会执行闭包中的代码。

 class FirstClass { class var someProperty = { // you can init the class member with anything you like or perform any code return SomeType }() } 

class stored properties not yet supported (在Xcode 8中testing)。

一个答案是使用static ,它和class final是一样的。

好的链接是

使用闭包或函数设置默认属性值

摘录自:苹果公司“Swift编程语言”, iBooks 。


代码示例:

 class FirstClass { static let someProperty = { () -> [Bool] in var temporaryBoard = [Bool]() var isBlack = false for i in 1...8 { for j in 1...8 { temporaryBoard.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } print("setting default property value with a closure") return temporaryBoard }() } print("start") FirstClass.someProperty 

打印

开始

用闭包设置默认的属性值

所以这是懒惰的评估。

对于@objc类, class func initialize()肯定有效,因为+initialize是由Objective-C运行时实现的。 但对于“本地”Swift类,你必须看到其他的答案。

我找不到任何有效的用例在Swift中使用+[initialize] 。 也许这解释了它不存在的方式

为什么我们需要在ObjC中+[initialize]

初始化一些全局variables

 static NSArray *array; + (void)initialize { array = @[1,2,3]; } 

在Swift中

 struct Foo { static let array = [1,2,3] } 

做一些破解

 + (void)initialize { swizzle_methodImplementation() } 

这是不支持的Swift(我不明白如何为纯Swift类/结构/枚举)