我在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'嗎?
編輯:要重現它,你可以使用Wakup
和TagListView
吊艙(分別FrameworkA和FrameworkB),並嘗試執行上面的代碼。
如果你使用'(tagView爲TagView).cornerRadius = 10',或'(tagView爲TagListView.TagView).cornerRadius = 10' –
@LukeVanIn同樣的錯誤會發生什麼。我不認爲它有什麼區別,因爲'tagView'已經是'TagView'。 – redent84