2016-07-12 110 views
2

我在XCode 7.3中有一個Swift 2項目,我使用兩個不同的第三方框架。在Swift中擴展屬性衝突的子類聲明

'FrameworkA' 聲明瞭一個公共UIView擴展聲明cornerRadius屬性是這樣的:

extension UIView { 
    var cornerRadius: CGFloat { 
     get { return self.layer.cornerRadius } 
     set(cornerRadius) { 
      self.layer.masksToBounds = true 
      self.layer.cornerRadius = cornerRadius 
     } 
    } 
} 

'FrameworkB' 聲明一個UIView子類有cornerRadius屬性:

class TagView: UIView { 
    var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 
} 

兩個框架編譯爲完全正常他們不認識對方。但是,試圖利用「FrameworkB的財產在我的代碼的時候:

let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius = 10 // Compilation error 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

它失敗,出現錯誤:

Ambiguous use of 'cornerRadius'

我能稱之爲「FrameworkA」擴展屬性的類型轉換到UIView,但即使我不在該文件中導入'FrameworkA',我也無法調用'FrameworkB'類屬性。只要我在項目的某個地方導入'FrameworkA',它就會開始失敗。

有什麼辦法可以明確告訴編譯器使用'FrameworkB'方法或避免在Swift文件中導入'FrameworkA'嗎?

編輯:要重現它,你可以使用WakupTagListView吊艙(分別FrameworkA和FrameworkB),並嘗試執行上面的代碼。

+0

如果你使用'(tagView爲TagView).cornerRadius = 10',或'(tagView爲TagListView.TagView).cornerRadius = 10' –

+0

@LukeVanIn同樣的錯誤會發生什麼。我不認爲它有什麼區別,因爲'tagView'已經是'TagView'。 – redent84

回答

1

我目前的解決方案是在同一個項目中創建一個動態框架目標'ProxyFramework'。我使用的CocoaPods添加「FrameworkB」的依賴,並宣佈了新的屬性,不會與「FrameworkA」聲明的擴展方法衝突:

public extension TagList { 
    public dynamic var cornerRadius_: CGFloat { 
     get { return cornerRadius } 
     set { cornerRadius = newValue } 
    } 
} 

在我的應用程序的目標,我新創建的框架目標添加到「目標相關性,所以我現在可以使用‘通過這個代理框架FrameworkB’屬性:

let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius_ = 10 // ProxyFramework -> FrameworkB: Ok 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

我很願意看到一個清晰的解決方案。

0

如果你在不相關的地方使用這些不同的類,也許你可以只在實際需要它們的源文件中導入特定的符號。

import class FrameworkA.TagView