当前位置:  开发笔记 > IOS > 正文

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

如何解决《带闭包的默认属性值使编译器重新编译所有文件》经验,为你挑选了1个好方法。

这个源有一个段落设置一个带有闭包或函数的默认属性值,我们可以在其中找到一个例子

这是一个关于如何使用闭包来提供默认属性值的骨架轮廓:

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)

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

问题:

是什么原因?

任何建议如何使用默认值闭包而不是重新编译?

与此主题相关?

Robert Gumme.. 6

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



1> Robert Gumme..:

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

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有