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

时间:2016-07-12 10:38:10

标签: 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 = 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

失败并显示错误:

  

模糊地使用'cornerRadius'

我能够将'FrameworkA'扩展属性类型转换为UIView,但即使我不在此导入'FrameworkA',我也无法调用'FrameworkB'类属性文件。一旦我在项目的某处导入'FrameworkA',它就会开始失败。

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

修改:要重现它,您可以使用WakupTagListView窗格(分别为FrameworkA和FrameworkB)并尝试执行上述代码。

2 个答案:

答案 0 :(得分:1)

我目前的解决方案是在同一个项目中创建一个动态框架目标'ProxyFramework'。我使用Cocoapods添加'FrameworkB'依赖项并声明一个新属性,该属性不与'FrameworkA'中声明的扩展方法冲突:

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

在我的应用程序目标中,我将新创建的框架目标添加到“Target Dependencies”,因此我现在可以通过此代理框架使用'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

我希望看到一个更清洁的解决方案。

答案 1 :(得分:0)

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

 import class FrameworkA.TagView