Ios Swift中扩展属性与子类声明冲突

Ios Swift中扩展属性与子类声明冲突,ios,swift,Ios,Swift,我在XCode 7.3中有一个Swift 2项目,我使用了两种不同的第三方框架 “FrameworkA”声明公共UIView扩展,声明cornerRadius属性,如下所示: extension UIView { var cornerRadius: CGFloat { get { return self.layer.cornerRadius } set(cornerRadius) { self.layer.masksToBounds

我在XCode 7.3中有一个Swift 2项目,我使用了两种不同的第三方框架

“FrameworkA”声明公共
UIView
扩展,声明
cornerRadius
属性,如下所示:

extension UIView {
    var cornerRadius: CGFloat {
        get { return self.layer.cornerRadius }
        set(cornerRadius) {
            self.layer.masksToBounds = true
            self.layer.cornerRadius = cornerRadius
        }
    }
}
“FrameworkB”使用
cornerRadius
属性声明
UIView
子类:

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
它失败并出现以下错误:

“拐角半径”的用法不明确

我可以调用'FrameworkA'扩展属性类型转换为
UIView
,但即使我没有在此文件中导入'FrameworkA',我也无法调用'FrameworkB'类属性。一旦我在项目的某个地方导入“FrameworkA”,它就开始失败

有没有办法明确告诉编译器使用“FrameworkB”方法或避免在Swift文件中导入“FrameworkA”


编辑:要复制它,您可以使用
Wakup
TagListView
pods(分别是FrameworkA和FrameworkB)并尝试执行上面的代码。

我当前的解决方案是在同一项目中创建动态框架目标“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

我希望看到一个更干净的解决方案。

如果您在不相关的地方使用这些不同的类,也许您可以只在实际需要它们的源文件中导入特定符号

 import class FrameworkA.TagView

如果使用
(tagView作为tagView)。cornerRadius=10
,或
(tagView作为TagListView.tagView)。cornerRadius=10
@Lukevan会发生什么情况?同样的错误。我不认为这有什么区别,因为
tagView
已经是
tagView