gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:16:13 41 4
gpt4 key购买 nike

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

'FrameworkA' 声明一个公共(public) 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

失败并出现错误:

Ambiguous use of 'cornerRadius'

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

有什么方法可以显式告诉编译器使用“FrameworkB”方法或避免在 Swift 文件中导入“FrameworkA”?

编辑:要重现它,您可以使用WakupTagListView pod(分别是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

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

关于ios - Swift 中的扩展属性冲突子类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38326479/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com