在Swift中初始化类的方法?
我正在寻找类似于Objective-C的+(void)initialize
类方法的行为,因为该方法在类初始化时调用一次,之后再也不会再调用。
class
closures中的一个简单class init () {}
将非常光滑! 很显然,当我们使用“ class var
s”而不是“结构闭包中的static var
variables”时,这一切都将非常吻合!
如果你有一个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类/结构/枚举)