Name collisions for extension methods from different frameworks

Deadly 提交于 2019-12-03 11:55:30

问题


As a test, I created two frameworks. Both frameworks contain this extension:

public extension UIDevice {
    var extraInfo: UIDeviceExtraInfo {
        return UIDeviceExtraInfo()
    }
}

public class UIDeviceExtraInfo {
    public var prop: String = "Device1"  //"Device2" is used in another framework
}

I then imported the two frameworks and attempt to print UIDevice.currentDevice().extraInfo.prop. Swift compiler gives the error: Ambiguous use of extraInfo".

How does one go about resolving name clashing like this?


回答1:


In this specific case, you can disambiguate extraInfo prop by explicilty specifying expected type:

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

But, when the method/prop return the same type:

// 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) // -> ???

There is no way to disambiguate them. And regardless the application code imports which Framework, it seems, the actual called implementation depends on the order in Linked Frameworks and Libraries in "First come, first served" manner. But, as far as I know, this behavior is not guaranteed.




回答2:


After doing a bit of experimentation, the only way I've found is to only import one of the frameworks into your source file.



来源:https://stackoverflow.com/questions/33892897/name-collisions-for-extension-methods-from-different-frameworks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!