关于ios:swift中的类的”初始化”类方法?

“initialize” class method for classes in Swift?

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

一个简单的class init () {}class关闭将是非常光滑的!很明显,当我们使用"class vars"而不是"static vars in a struct closure"时,这一切都将非常匹配!


如果您有一个objective-c类,那么最简单的方法就是重写+initialize。但是,确保类的子类也覆盖+initialize,否则类的+initialize可能会被多次调用!如果您愿意,可以使用dispatch_once()(如下所述)来防止多次呼叫。

1
2
3
4
5
class MyView : UIView {
  override class func initialize () {
    // Do stuff
  }
}

nbsp;

如果你有一个快速班,你能得到的最好的是dispatch_once()init()声明内。

1
2
3
4
5
6
7
8
9
private var once = dispatch_once_t()

class MyObject {
  init () {
    dispatch_once(&once) {
      // Do stuff
    }
  }
}

这个解决方案不同于+initialize(这是第一次给objective-c类发送消息时调用的),因此不是问题的真正答案。但我觉得它很好用。


swift中没有类型初始值设定项。

"Unlike stored instance properties, you must always give stored type properties a default value. This is because the type itself does not have an initializer that can assign a value to a stored type property at initialization time."

摘自:苹果公司。"Swift编程语言。"iBooks。

您可以使用一个类型属性,默认值是一个闭包。因此,当设置了类型属性(或类变量)时,将执行闭包中的代码。

1
2
3
4
5
6
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(在xcode8中测试)。

一个答案是使用static,与class final相同。

很好的链接是

Setting a Default Property Value with a Closure or Function

摘自:苹果公司。"Swift编程语言。"iBooks。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

印刷品

start

setting default property value with a closure

所以这是懒惰的评价。


对于@objc类,class func initialize()肯定有效,因为+initialize是由objective-c运行时实现的。但是对于"本地"的快速课程,你必须看到其他答案。


@亚历克森成功了,但从最近的Swift4开始,你不能直接覆盖initialize。您仍然可以使用objective-c实现它,并且使用class/static swiftyInitialize方法来实现从MyClass.m中的objective-c调用的继承自NSObject的类的类别,这些方法包括在MyClass.swift旁边的编译源中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# MyView.swift

import Foundation
public class MyView: UIView
{
    @objc public static func swiftyInitialize() {
        Swift.print("Rock 'n' roll!")
    }
}

# MyView.m

#import"MyProject-Swift.h"
@implementation MyView (private)
    + (void)initialize { [self swiftyInitialize]; }
@end

如果你的阶级不能继承NSObject,用+load代替+initialize是一种合适的做法,你可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# MyClass.swift

import Foundation
public class MyClass
{
    public static func load() {
        Swift.print("Rock 'n' roll!")
    }
}
public class MyClassObjC: NSObject
{
    @objc public static func swiftyLoad() {
        MyClass.load()
    }
}

# MyClass.m

#import"MyProject-Swift.h"
@implementation MyClassObjC (private)
    + (void)load { [self swiftyLoad]; }
@end

有几个gotchas,特别是在静态库中使用这种方法时,请查看介质上的完整文章了解详细信息!???


我找不到任何有效的用例来使用类似于+[initialize]的swift。也许这就解释了它不存在的原因

为什么在objc中需要+[initialize]

初始化某个全局变量

1
2
3
4
5
static NSArray *array;

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

哪个在雨燕

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

做一些砍伐

1
2
3
+ (void)initialize {
    swizzle_methodImplementation()
}

Swift不支持(我不知道如何为纯Swift类/结构/枚举执行此操作)