【发布时间】:2018-10-03 02:35:29
【问题描述】:
我试图通过我无法确定的默认实现来获得一些功能。考虑下面的代码,它是对我正在尝试做的事情的简化,但尽可能简单地捕获了问题。
//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 returnsSelfand has associated type requirements
基本上,我不能有一个返回Self 并使用关联类型的方法。总是连续调用这两种方法对我来说真的很讨厌。我只想为每个班级声明configure(Data) 并免费获得generateObjectAndConfigure(Data)。
有什么建议吗?
【问题讨论】:
-
请注意,某些类的默认实现会崩溃,例如
UICollectionView。同样使用Self()有点滥用了无参数初始化器仍然可用UIView的事实,即使对于许多子类来说调用它没有意义。最好将这两者分开:实例化和配置。
标签: ios swift swift-protocols associated-types default-implementation