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

问题描述 投票:13回答:3

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

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"

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

ios swift namespaces swift-extensions
3个回答
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

但是,当方法/属性返回相同类型时:

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

没有办法消除它们的歧义。而且,无论应用程序代码导入哪个框架(似乎),实际调用的实现方式都取决于“ [链接的框架和库]”中“先来先服务”的顺序。但是,据我所知,这种行为无法得到保证。screenshot

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

1
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.