Подтвердить что ты не робот

Коллизии имен для методов расширения из разных фреймворков

В качестве теста я создал две структуры. Оба фреймворка содержат это расширение:

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".

Как можно решить конфликт имен таким образом?

4b9b3361

Ответ 1

В этом конкретном случае вы можете disambiguate extraInfo prop посредством explicilty, определяющего ожидаемый тип:

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, по-видимому, фактическая вызываемая реализация зависит от порядка в Связанных рамок и библиотек в способе "Первый пришел, первым обслужен". Но, насколько я знаю, это поведение не гарантируется.

screenshot

Ответ 2

После небольшого эксперимента, единственный способ, которым я нашел, - только импортировать одну из фреймворков в исходный файл.