【发布时间】:2021-03-11 15:02:02
【问题描述】:
我有一个Savable 协议,它有多个版本的save() 方法,基于C1 和C2 的一致性。然后还有一个符合Savable协议的Downloadable协议,它根据C1和C2的一致性调用Savable的save()方法。
从下面的示例代码可以看出,download() 方法都是一样的。有没有办法通过删除重复的功能来简化这段代码?还是我应该使用另一种完全不同的方法来获得相同的结果?
PS:由于某些未提及的技术原因,Savable 和 Downloadable 都需要成为协议。此外,C1 和 C2 都具有 Self 或关联的类型要求,因此无法执行类型检查。
// Constraint
protocol C1 { }
protocol C2 { }
// Savable
protocol Savable { }
extension Savable {
func save() {
print("Perform basic save")
}
}
extension Savable where Self: C1 {
func save() {
print("Perform save C1")
}
}
extension Savable where Self: C1 & C2 {
func save() {
print("Perform save C1 & C2")
}
}
// Downloadable
protocol Downloadable: Savable { }
extension Downloadable {
func download() {
print("Perform download")
save()
}
}
extension Downloadable where Self: C1 {
func download() {
print("Perform download")
save()
}
}
extension Downloadable where Self: C1 & C2 {
func download() {
print("Perform download")
save()
}
}
// Usage
class MyClassC1: Downloadable, C1 { }
let obj1 = MyClassC1()
obj1.download()
// Output:
// Perform download
// Perform save C1
class MyClassC1C2: Downloadable, C1, C2 { }
let obj2 = MyClassC1C2()
obj2.download()
// Output:
// Perform download
// Perform save C1 & C2
提前致谢!
【问题讨论】:
-
你应该可以把实现的download()方法放在Donwloadable协议中,任何符合Downloadable协议的类都会有它
-
我同意,事实上为什么您的任何协议都没有在其中声明函数?
protocol Savable { func save() }和protocol Downloadable: Savable { func download() }? -
我希望所有这些都具有
save()和download()方法所依赖的其他要求,而不是要求提供这些方法的协议。