Home > Blockchain >  Swift Package in workspace: import rule?
Swift Package in workspace: import rule?

Time:12-20

I create a swift package in my work space.

I followed this guide just to test things out:

https://sarunw.com/posts/how-to-modularize-existing-ios-projects-using-swift-package/

All went well.

One of the things I added to the package is:

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

}

I deleted the customRed from the Assets.xcassets in my main app after I added the Assets to the actual package.

Everything works fine now and the package uses the customRed as defined in the package Assets.xcassets.

I have a lot files that use that Color.customRed in the app and I was thinking I had to go to each file and add the import statement for the package at the top. So:

import MyColorPackage

Question: I don't understand why the app works fine without doing that. Files can use the Color.customRed call without adding the import MyColorPackage at the top of the file that uses it. How can files use that customRed without having the import MyColorPackage in the file? App runs fine without importing the module in the files that use the customRed. Why?

CodePudding user response:

The reason for this is due to a longstanding swift bug so you’re not doing anything wrong per se. It has various forms, some fixed over the years, some not but in your case what happens is that the first file in your main project that imports MyColorPackage will cause the whole rest of the project to “see” that Color extension. In my experience this happens only with public extensions nowadays and your package happens to do just that - declare a public extension to SwiftUI’s Color

If you add some public entity in that package, say …

import SwiftUI

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

… then you won’t be able to use MyColorTheme in any file that doesn’t import MyColorPackage, as per what is intuitively normal.

I would suggest to still add the missing imports whenever you use symbols from that package as this issue might be fixed in a future version and your project will fail to build

Reference: https://github.com/apple/swift/issues/46493

  • Related