我正在寻找类似于Objective-C的+(void)initialize
类方法的行为,因为该方法在初始化类时被调用一次,之后再也不会被调用.
一个简单class init () {}
的class
关闭将是非常时尚!显然,当我们在结构封闭中使用" class var
s"而不是" static var
s"时,这一切都将很好地匹配!
ale*_*son 62
如果你有一个Objective-C类,那么最简单的就是覆盖它+initialize
.但是,请确保您的类的子类也会覆盖+initialize
,否则您的类+initialize
可能会被多次调用!如果需要,您可以使用dispatch_once()
(如下所述)防止多次通话.
class MyView : UIView {
override class func initialize () {
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个Swift类,你可以获得的最好的是dispatch_once()
在init()
语句中.
private var once = dispatch_once_t()
class MyObject {
init () {
dispatch_once(&once) {
// Do stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案不同于+initialize
(这是第一次发布一个Objective-C类的消息),因此不是问题的真正答案.但它足够好,IMO.
Bin*_*ian 51
Swift中没有类型初始值设定项.
"与存储的实例属性不同,您必须始终为存储的类型属性提供默认值.这是因为类型本身没有初始化程序,可以在初始化时为存储的类型属性赋值."
摘录自:Apple Inc."The Swift Programming Language." iBooks.
您可以使用默认值为闭包的type属性.因此,当设置type属性(或类变量)时,将执行闭包中的代码.
class FirstClass {
class var someProperty = {
// you can init the class member with anything you like or perform any code
return SomeType
}()
}
Run Code Online (Sandbox Code Playgroud)
但是class stored properties not yet supported
(在Xcode 8中测试过).
一个答案是使用static
,它是一样的class final
.
对此有好的联系
使用闭包或函数设置默认属性值
摘录自:Apple Inc."The Swift Programming Language." 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
Run Code Online (Sandbox Code Playgroud)
打印
开始
使用闭包设置默认属性值
所以它是懒惰的评估.
对于@objc
类,class func initialize()
确实有效,因为它+initialize
是由Objective-C运行时实现的.但对于"原生"Swift课程,你必须看到其他答案.
您可以使用存储类型属性而不是initialize
方法。
class SomeClass: {
private static let initializer: Void = {
//some initialization
}()
}
Run Code Online (Sandbox Code Playgroud)
但是由于存储类型属性实际上是在第一次访问时延迟初始化的,因此您需要在某处引用它们。你可以用普通的存储属性来做到这一点:
class SomeClass: {
private static let initializer: Void = {
//some initialization
}()
private let initializer: Void = SomeClass.initializer
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
57582 次 |
最近记录: |