[英]Swift typealias in protocol and generic types
我有一个协议,有一个typealias:
protocol Fooable {
typealias T: Equatable
func makeFoo() -> T
}
我希望,符合它的所有类型都将从makeFoo
返回Equatable值。
现在我想创建一个数组扩展,它存储Fooable
值:
extension Array where Element: Fooable {
func arrayFoo<F: Foobable, S>(array: Array<F>, transform: (Element, [F]) -> S) -> [S] {
我希望,给定数组A,其中包含Fooable
元素和数组B,其中包含我可以制作的Fooable
元素:
a.arrayFoo(b, {...})
我有一部分arrayFoo
函数:
var leftGenerator = self.generate()
var rightGenerator = array.generate()
if let leftValue = leftGenerator.next(), rightValue = rightGenerator.next() {
let leftFoo = leftValue.makeFoo()
let rightFoo = rightValue.makeFoo()
if leftFoo == rightFoo {
我希望leftFoo
和rightFoo
是Equatable,因为它们是由makeFoo()
,它应该返回Equatables。
但Swift抱怨: Binary operator == cannot be applied to operands of type Element.T and FT
任何想法或解决方法?
在你的arrayFoo()
方法中, array
和self
都是Fooable
元素的数组,但不一定具有相同的底层类型T
,即Element.T
和FT
是不相关的类型。
您可以使用类型占位符上的where FT == Element.T
附加约束来解决此问题:
func arrayFoo<F: Fooable, S where F.T == Element.T >(array: Array<F>, transform: (Element, [F]) -> S) -> [S] {
// ...
}
我认为这个问题在Equatable
协议中,查看它的声明:
@warn_unused_result
public func ==(lhs: Self, rhs: Self) -> Bool
你应该覆盖func ==
并为此提供一些结果,或者Swift
编译器不知道,热点比较它。 您使用泛型类型,例如,如何比较Int
和String
并未解决
let t = 0
let a = "string"
if t == a { // error
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.