16

テストとして、2 つのフレームワークを作成しました。どちらのフレームワークにも、次の拡張機能が含まれています。

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

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

次に、2 つのフレームワークをインポートして、印刷を試みましたUIDevice.currentDevice().extraInfo.prop。Swift コンパイラは次のエラーを返します: Ambiguous use of extraInfo".

このような名前の競合を解決するにはどうすればよいですか?

4

3 に答える 3

6

この特定のケースでは、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

ただし、メソッド/小道具が同じ型を返す場合:

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

それらを明確にする方法はありません。また、アプリケーションコードがどのフレームワークをインポートするかに関係なく、実際に呼び出される実装は、リンクされたフレームワークとライブラリの「先着順」の順序に依存するようです。しかし、私の知る限り、この動作は保証されていません。

スクリーンショット

于 2015-11-24T13:18:39.947 に答える
1

少し実験した後、私が見つけた唯一の方法は、フレームワークの 1 つだけをソース ファイルにインポートすることです。

于 2015-11-24T13:14:25.177 に答える