我有一个通用类,需要根据通用类型返回一些数据。
以下解决方案适用于具体的实现,不适用于诸如CaseIteratable之类的协议。有没有解决方法?即使在SomeThing
内部,我也可以检查大小写是否可以重复使用,但是编译器不允许这样做
struct SomeThing<T>: DoSomething {
let value: T
func doSomething() {
if let doable = value as? DoSomething {
doable.doSomething()
}
}
}
protocol DoSomething {
func doSomething()
}
extension Bool: DoSomething {
func doSomething() {
"bool action"
}
}
// Won't compile
extension CaseIterable: DoSomething where Self: RawRepresentable {
func doSomething() {
"bool action"
}
}
我还尝试为某些内容添加扩展名,但最终遇到了相同的问题
extension SomeThing: DoSomething where T: Bool {}
extension SomeThing: DoSomething where T: CaseIteratable {}
答案 0 :(得分:0)
基于Swift文档
定义协议扩展时,可以指定约束 一致的类型必须满足之前的方法和属性 扩展名可用。您将这些约束写在 通过编写泛型where子句扩展您要扩展的协议。对于 有关通用where子句的更多信息,请参见Generic Where Clauses。
struct SomeThing<T>: DoSomething {
let value: T
func doSomething() {
if let doable = value as? DoSomething {
doable.doSomething()
}
}
}
protocol DoSomething {
func doSomething()
}
extension Bool: DoSomething {
func doSomething() {
"bool action"
}
}
// this will compiles
extension CaseIterable where Self: RawRepresentable, Self.RawValue == Bool {
func doSomething() {
"bool action"
}
}
extension CaseIterable where Self: DoSomething {}
这是Github问题的另一个答案
这是因为出于一致性目的需要约束,否则编译器会认为这是继承。
希望这会有所帮助