2015-11-24 17 views
11

テストとして、私は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"を返します。

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

+0

ここで(答えなし)基本的に同じ質問:http://stackoverflow.com/questions/32736698/swift-extension-same-extension-function-in-two-modules。私は解決策がないと仮定します。 –

答えて

1

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

この特定のケースで
+0

それはコンパイルされますが、インポートされたフレームワークのメソッドが使用されることを保証するものではありません。 http://stackoverflow.com/q/32736698/1187415の最後の例を参照してください。 –

+0

小さな単位テストでうまくいきましたが、構造体であり、実行時に呼び出しを明確にするのに役立つかもしれない 'String'に拡張を追加することを選択しました。 – JeremyP

6

、あなたがexpliciltyでextraInfo小道具を明確にすることができ期待指定タイプ:

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

は方法はありません。

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それらをあいまいにする。そして、フレームワークであるがアプリケーションコードのインポートに関係なくのように見える場合、実際に呼び出される実装は、のリンクフレームワークとライブラリの順序に依存します。しかし、私が知る限り、この動作は保証されていません。

screenshot

+0

I * think * FW1からの1つのメソッドとFW2からの別のメソッドが呼び出された場合もありましたが、わかりません。 - NSObjectサブクラスの拡張はObjective-Cカテゴリであり、異なるObjCカテゴリで同じメソッドを定義することは未定義の動作です。 http://stackoverflow.com/questions/32736698/swift-extension-same-extension-function-in-ww-modulesで述べたように、振る舞い*は純粋なSwift拡張では異なるかもしれません。 –

+0

実際には、アプリケーションでFW1をインポートするだけの場合が動作します。コンソールは私のテストでDevice1をプリントします。 – Boon