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

Boo*_*oon 13 namespaces ios swift swift-extensions

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

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

public class UIDeviceExtraInfo {
    public var prop: String = "Device1"  //"Device2" is used in another framework
}
Run Code Online (Sandbox Code Playgroud)

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

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

rin*_*aro 6

在这种特定情况下,您可以extraInfo通过明确指定预期类型来消除道具的歧义:

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
Run Code Online (Sandbox Code Playgroud)

但是,当方法/ 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) // -> ???
Run Code Online (Sandbox Code Playgroud)

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

截图


Jer*_*myP 1

经过一些实验后,我发现的唯一方法是仅将其中一个框架导入到源文件中。