此source有一段设置带闭包或函数的默认属性值,我们可在其中找到示例
这是一个关于如何使用闭包来提供默认属性值的骨架轮廓:
class SomeClass { let someProperty: SomeType = { // create a default value for someProperty inside this closure // someValue must be of the same type as SomeType return someValue }() }
好吧,我经常使用它...而且,经常在更改一个符号后等待整个项目重新编译。今天我发现这两件事情彼此联系在一起。
让我们假设我们有一些类,我们使用闭包和函数
设置一些默认属性class Class1 {
let value: Int
init(_ value: Int) {
self.value = value
}
private lazy var lazyValueWithClosure: Int = {
return 1111
}()
private lazy var lazyValueWithFunction: Int = self.getValue()
private func getValue() -> Int {
return 2222
}
}
另外,我们在单独的文件中有一些其他类,我们使用上面的Class1
class Class2 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class1(100)
}
}
我们使用Class2
class Class3 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class2(100)
}
}
等...
我决定使用terminal
+ xcodebuild
+ grep
来获取有关重新编译文件的信息。这是我用来获取编译信息的命令:
xcodebuild -scheme Test -sdk iphonesimulator -arch x86_64 -configuration Debug build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep '^[0-9]\{1,20\}.[0-9]\{1,20\}ms.*init(_ value: Int)'
这就是准备工作。现在我们转到Class1
并将2222
更改为其他值。运行以上命令并获得结果。
0.1ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
结果很好。使用函数设置默认值按预期工作。我们更改了一个文件,只编译了一个文件。
然后让我们将值1111
从Class1
更改为其他值并运行命令。终端输出现在看起来像这样:
0.8ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class5.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
1.0ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class4.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class3.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class2.swift:11:5 init(_ value: Int)
所有类都被重新编译了......现在假设你有一个大型项目,默认值闭包中的任何小变化都会让你等待整个项目重新编译。
问题:
答案 0 :(得分:5)
这是Swift编译器中的一个已知问题。问题是,一旦你使用这样的闭包或惰性属性,每个Swift文件都将被类型检查。我写了一篇关于这个主题的博客文章,你可以找到here。