2015-11-24 28 views
11

Bir test olarak iki çerçeve oluşturdum. Her iki çerçeveler bu uzantıyı içerir:Farklı çerçevelerden uzantı yöntemleri için isim çarpışmaları

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

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

Sonra iki çerçeveler ithal ve UIDevice.currentDevice().extraInfo.prop yazdırmaya çalışırsanız. Swift derleyici hata verir: Ambiguous use of extraInfo".

Nasıl böyle bir isim çatışması çözmek için gider?

+0

Esasen burada (cevap olmadan) aynı soru: http://stackoverflow.com/questions/32736698/swift-extension-same-extension-function-in-two-modules. Çözüm olmadığını düşünüyorum. –

cevap

1

Biraz deneme yaptıktan sonra, bulduğum tek yol, yalnızca çerçevelerden birini kaynak dosyanıza aktarmaktır.

Bu özel durumda
+0

Bu, derlemeyi sağlar, ancak içe aktarılan çerçeveden yöntemin kullanılmasını garanti etmez. Http://stackoverflow.com/q/32736698/1187415 adresinin sonundaki örneğe bakın. –

+0

Yaptığım küçük birim testinde gayet iyi çalıştı, ancak uzantıları eklenti olarak eklemeyi seçtim, bu da bir yapılandırma ve çağrıları çağrı zamanında ayırt etmemize yardımcı olabilir. – JeremyP

6

, sen explicilty tarafından extraInfo pervane sorun aşılabilir beklenen belirterek türü:

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

yolu yoktur:

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 

Fakat yöntemi/aynı tür iade prop onları berraklaştırmak için. Uygulama kodunun hangi çerçeveyi kullandığını dikkate almadan, , görünür, gerçek çağrılan uygulama, "İlk gelen, ilk yayınlanmış" şekilde Bağlantılı Çerçeveler ve Kitaplıklar'daki sırasına göre değişir. Ancak, bildiğim kadarıyla, bu davranış garanti edilmez.

screenshot

+0

I * düşünüyorum * Ayrıca FW1'den bir yöntem ve FW2'den başka bir yöntemin çağrıldığı durum vardı, ama emin değilim. - NSObject alt sınıflarının uzantıları Objective-C kategorileridir ve farklı ObjC kategorilerinde aynı yöntemi tanımlamak tanımlanmamış bir davranıştır. Http://stackoverflow.com/questions/32736698/swift-extension-same-extension-function-in-two-modules adresinde belirtildiği gibi, davranış * "saf" Swift uzantıları için * farklı olabilir. –

+0

Aslında uygulama işlerinde sadece FW1 içe aktarma durumu. Konsol testimde Test1'i yazdırıyor. – Boon