swift 如何避免从模块中导入函数

a64a0gku  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(119)

我有两个包:FirstModuleAnotherModule,并且它们中的每一个定义了

extension CGPoint {
    public static func + (lhs: CGPoint, rhs: CGPoint) -> CGPoint {
        CGPoint(x: lhs.x + rhs.x, y: lhs.y+rhs.y)
    }
}

也在我定义的主应用程序中

extension CGPoint {
#if !canImport(FirstModule) && !canImport(AnotherModule)
    public static func + (lhs: CGPoint, rhs: CGPoint) -> CGPoint {
        CGPoint(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }
...
#endif
}

和另一个文件中某些类:

#import FirstModule 
#import AnotherModule

class Whatever() {
    ///Uses CGPoint + CGPoint
}

不幸的是,编译器抛出一个错误:Ambiguous use of operator '+'并指向两个导入的模块。并非我的应用中的所有类都使用FirstModuleAnotherModule,但它们只需要func + ()
如何避免从Whatever类中的FirstModuleAnotherModule导入func + ()

polhcujo

polhcujo1#

一种可能的方法是显式地从其中一个模块导入您正在使用的所有内容。
您可以显式导入类型别名、结构、类、枚举、协议、全局letvar和函数。
示例:

import typealias FirstModule.SomeTypeAlias
import struct FirstModule.SomeStruct
import class FirstModule.SomeClass
import enum FirstModule.SomeEnum
import protocol FirstModule.SomeProtocol
import let FirstModule.someGlobalConstant
import var FirstModule.someGlobalVar
import func FirstModule.someGlobalFunction
import AnotherModule

// now you will use the CGPoint.+ from AnotherModule

请注意,您不能显式导入扩展名或操作符。如果您需要FirstModule中的扩展名或操作符(不是CGPoint.+),我建议您将它们移到另一个只有import FirstModule的文件中。
(不用说,您应该用您正在使用 * 更少 * 成员的模块替换FirstModule

相关问题