我试图通过我无法确定的默认实现来获得一些功能。考虑下面的代码,它是我正在尝试做的事情的简化,但尽可能简单地捕获了问题。
//protocol definition
protocol Configurable {
associatedtype Data
func configure(data: Data)
static func generateObject() -> Self
}
//default implementation for any UIView
extension Configurable where Self: UIView {
static func generateObject() -> Self {
return Self()
}
}
//implement protocol for UILabels
extension UILabel: Configurable {
typealias Data = Int
func configure(data: Int) {
label.text = "\(data)"
}
}
//use the protocol
let label = UILabel.generateObject()
label.configure(data: 5)
print(label.text!) //5
我有一个协议,UIView 的某些方法的默认实现,以及 UILabel 的特定实现。
我的问题是最后一部分......所有这些功能的实际使用
let label = UILabel.generateObject()
label.configure(data: 5)
print(label.text!) //5
我发现自己在不断地generateObject()
跟着做configure(data: <something>)
。所以我尝试执行以下操作:
添加static func generateObjectAndConfigure(data: Data) -> Self
到协议中。当我尝试为此方法为 UIView 进行默认实现时,问题就出现了。我收到以下错误
Method 'generateObjectAndConfigure(data:)' in non-final class 'UILabel' cannot be implemented in a protocol extension because it returns
自己and has associated type requirements
基本上,我不能有一个返回Self
和使用关联类型的方法。总是连续调用这两种方法对我来说真的很讨厌。我只想configure(Data)
为每个班级声明并generateObjectAndConfigure(Data)
免费获得。
有什么建议么?