swift - 带闭包的默认属性值使编译器重新编译所有文件

标签 swift xcode terminal swift3 xcodebuild

source有一段 Setting a Default Property Value with a Closure or Function 我们可以在其中找到一个例子

Here’s a skeleton outline of how a closure can be used to provide a default property value:

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)

结果不错。使用函数设置默认值按预期工作。我们改了一个文件,只编译了一个文件。

然后让我们将值 1111Class1 更改为其他值并运行命令。终端输出现在看起来像这样:

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)

所有的类都被重新编译...现在假设您有一个大型项目,默认值闭包中的任何小更改都会让您等待整个项目重新编译。

问题:

  • 原因是什么?
  • 关于如何使用默认值闭包而不遭受重新编译的任何建议?
  • this topic相关?

最佳答案

这是 Swift 编译器中的一个已知问题。问题是,一旦你像这样使用闭包或惰性属性,每个 Swift 文件都会被类型检查。我写了一篇关于这个主题的博文,您可以找到 here .

关于swift - 带闭包的默认属性值使编译器重新编译所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41647354/

相关文章:

ios - 在 UIScrollView 中滚动期间启用 UITableView 滚动

ios - "Unknown class ABC in Interface Builder file"和 "This class is not key-value compliant..."

xcode - 如何添加 TableView 数据源并委托(delegate)给单独的类/对象?

git - 找不到 git 更新后 Hook 中的 Bash 命令

ios - 如何使用 pspdfkit 将 pdf 文件共享到电子邮件?

ios - WKWebView 不加载本地 html 文件

ios - 如何让角色(SpriteKit)跟随触摸并按住?

iphone - 如何将 XCode 项目保存为模板以供其他应用使用?

terminal - 无法将终端附加到 docker 中正在运行的容器

python-3.x - 导入错误 : No module named tkinter. Mac OS 终端