命名来自不同框架的扩展方法的冲突

作为测试,我创建了两个框架。 两个框架都包含此扩展:

public extension UIDevice { var extraInfo: UIDeviceExtraInfo { return UIDeviceExtraInfo() } } public class UIDeviceExtraInfo { public var prop: String = "Device1" //"Device2" is used in another framework } 

然后我导入了两个框架并尝试打印UIDevice.currentDevice().extraInfo.prop 。 Swift编译器给出错误: Ambiguous use of extraInfo"

如何解决这样的名字冲突?

在这种特定情况下,您可以通过指定期望类型的explicilty来消除extraInfo prop的歧义:

 import FW1 import FW2 let fw1Info = UIDevice.currentDevice().extraInfo as FW1.UIDeviceExtraInfo let fw2Info = UIDevice.currentDevice().extraInfo as FW2.UIDeviceExtraInfo print(fw1Info.prop) // -> Device1 print(fw2Info.prop) // -> Device2 

但是,当方法/ prop返回相同的类型时:

 // FW1 public extension UIDevice { var myInfo: String { return "Device1" } } // FW2 public extension UIDevice { var myInfo: String { return "Device2" } } // App import FW1 print(UIDevice.currentDevice().myInfo) // -> ??? 

没有办法消除它们的歧义。 而且无论应用程序代码导入哪个Framework, 看起来 ,实际调用的实现依赖于Linked Frameworks和Libraries中的“先到先得”方式。 但是,据我所知,这种行为并不能保证。

截图

在做了一些实验之后,我发现的唯一方法是只将一个框架导入到你的源文件中。