ios 工作区中的Swift包:是否导入规则?

oo7oh9g9  于 2022-12-20  发布在  iOS
关注(0)|答案(1)|浏览(122)

我在我的工作空间创建一个快速包。
我遵循以下指南只是为了测试一下:
https://sarunw.com/posts/how-to-modularize-existing-ios-projects-using-swift-package/
一切顺利。
我在软件包中添加的内容之一是:

public extension Color {
        
    static let customRed:Color = Color(uiColor: UIColor(named: "customRed", in: .module, compatibleWith: nil)!)

}

在将Assets添加到实际包中后,我从主应用程序的Assets. xcassets中删除了customRed
现在一切正常,包使用Assets.xcassets包中定义的customRed
我有很多文件在应用程序中使用Color.customRed,我想我必须去每个文件,并在顶部添加包的import语句。
import MyColorPackage
问:我不明白为什么不这样做应用就能正常运行。文件可以使用Color.customRed调用,而无需在使用它的文件顶部添加import MyColorPackage。文件中没有import MyColorPackage,文件如何使用customRed?应用在使用customRed的文件中无需导入模块就能正常运行。为什么?

flseospp

flseospp1#

这是因为一个长期存在的swift bug,所以你并没有做错任何事情。它有各种各样的形式,一些在过去的几年里得到了修复,有些不是,但在你的情况下,发生的是,在你的主项目中导入MyColorPackage的第一个文件将导致整个项目的其余部分"看到"该颜色扩展。根据我的经验,现在只有公共扩展才会出现这种情况,而你的包恰好就是这样做的--声明一个公共扩展给SwiftUI的Color
如果您在包中添加一些公共实体,比如...

import SwiftUI

public enum MyColorTheme {
    public static let myThemeButtonsColor = Color.green
}

...那么您将无法在任何不导入MyColorPackage的文件中使用MyColorTheme,这在直觉上是正常的。
我建议您在使用该包中的符号时仍然添加缺少的导入,因为这个问题可能会在将来的版本中得到修复,并且您的项目将无法构建
参考:https://github.com/apple/swift/issues/46493

相关问题