Swift协议与使用相同类型约束的关联类型一致

问题描述 投票:3回答:1

我正在尝试定义扩展协议A的协议B(后者包含关联的类型C),同时使用具有相同类型约束的where子句,如编译器所建议的那样。但是,执行此操作时,代码将不再编译。这是一个Swift错误(在这种情况下是Swift 4)吗?

更具体地说,下面的代码不会编译错误:

类型'E'不符合协议'A'

class D {

}

protocol A: class {
    associatedtype C: AnyObject
}

protocol B: A where C == D {

}

class E: B {

}

更改下面指定的协议B的定义将编译,但将显示此警告:

从协议“A”覆盖关联类型“C”的类型更好地表示为协议上的相同类型约束

protocol B: A {
    typealias C = D
}

使其在没有警告的情况下进行编译的唯一方法是在E类中指定typealias并在协议B中使用where子句,但这似乎复制了不必要的typealias:

protocol B: A where C == D {

}

class E: B {
    typealias C = D
}
swift swift4
1个回答
2
投票

我想类协议声明的类型约束在符合该协议时不会被类读取。

为了避免类型化的重复,您可以从协议B中删除相同的类型约束,并使用扩展来为协议B提供类型。

class D {

}

protocol A: class {
    associatedtype C
}

protocol B: A  {
}

extension B {
    typealias C = D
}

class E: B  {
}
© www.soinside.com 2019 - 2024. All rights reserved.