Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
协议和泛型类型中的Swift typealias_Swift_Protocols - Fatal编程技术网

协议和泛型类型中的Swift typealias

协议和泛型类型中的Swift typealias,swift,protocols,Swift,Protocols,我有一个协议,它有一个类型别名: protocol Fooable { typealias T: Equatable func makeFoo() -> T } 我希望所有符合它的类型都将从makeFoo返回相等的值 现在我想做一个数组扩展,它存储Fooable值: extension Array where Element: Fooable { func arrayFoo<F: Foobable, S>(array: Array<F>,

我有一个协议,它有一个类型别名:

protocol Fooable {
    typealias T: Equatable
    func makeFoo() -> T
}
我希望所有符合它的类型都将从
makeFoo
返回相等的值

现在我想做一个数组扩展,它存储
Fooable
值:

extension Array where Element: Fooable {

    func arrayFoo<F: Foobable, S>(array: Array<F>, transform: (Element, [F]) -> S) -> [S] {
我有一部分
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
是相等的,因为它们是由
makeFoo()
生成的,它应该返回相等的值

但斯威夫特抱怨:
二进制运算符==不能应用于Element.T和F.T类型的操作数


有什么想法或解决办法吗?

我认为问题出在
平等协议中,看看它的声明:

@warn_unused_result
public func ==(lhs: Self, rhs: Self) -> Bool
您应该重写func
==
并为此提供一些结果,或者
Swift
编译器不知道,可以进行比较。 您使用泛型类型,例如,如何比较
Int
String
,还没有解决

let t = 0
let a = "string"
if t == a { // error
}
arrayFoo()
方法中,
array
self
都是数组 属于
Fooable
元素,但不一定具有相同的底层 类型
T
,即
Element.T
F.T
是不相关的类型

您可以使用附加约束来修复该问题
其中F.T==Element.T
在类型占位符上:

func arrayFoo<F: Fooable, S where F.T == Element.T >(array: Array<F>, transform: (Element, [F]) -> S) -> [S] {
    // ...
}
func-arrayFoo(数组:数组,变换:(元素,[F])->S)->[S]{
// ...
}

那么我应该如何实现泛型类型的
==
呢?我在这里搜索了一些很好的答案-你们可以看一下,我在操场上玩你们的案例
func arrayFoo<F: Fooable, S where F.T == Element.T >(array: Array<F>, transform: (Element, [F]) -> S) -> [S] {
    // ...
}