命名来自不同框架的扩展方法的冲突
作为测试,我创建了两个框架。 两个框架都包含此扩展:
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中的“先到先得”方式。 但是,据我所知,这种行为并不能保证。
在做了一些实验之后,我发现的唯一方法是只将一个框架导入到你的源文件中。