我正在尝试使用sorted
对元组数组进行排序。
我得到的错误是:
无法使用类型的参数列表调用'sorted'(((MyClass1,MyClass2)) - > Bool)
数组的创建方式如下:
class MyClass1 {
var id: Int
init(id:Int) { self.id = id }
}
class MyClass2 {
var id2: Int
init(id2:Int) { self.id2 = id2 }
}
let array1 = [MyClass1(id:4), MyClass1(id:3), MyClass1(id:2), MyClass1(id:1)]
let array2 = [MyClass2(id2:1), MyClass2(id2:2), MyClass2(id2:3), MyClass2(id2:4)]
var tuples = zip(array1, array2)
我尝试过:
tuples = tuples.sorted { (left, right) -> Bool in
return left.1.id2 > right.1.id2
}
tuples = tuples.sorted { $0.1.id2 > $1.1.id2 }
tuples = tuples.sorted(by: { (first: (MyClass1, MyClass2), second: (MyClass1, MyClass2)) -> Bool in
return first.1.id2 > second.1.id2
})
预期输出为(伪,手写):
[(myClass1WithId_1, myClass2WithId2_4),(myClass1WithId_2, myClass2WithId2_3),(myClass1WithId_3, myClass2WithId2_2),(myClass1WithId_4, myClass2WithId2_1)]
按myClass2.id2降序排序的元组。
更新
我发现了如何解决这个问题。错误似乎是错误的/误导性的。
我可以在将结果分配给新变量时对其进行排序:
let tuples2 = tuples.sorted { (left, right) -> Bool in
return left.1.id2 > right.1.id2
}
将其分配给现有变量时,会给出上述错误:
tuples = tuples.sorted { (left, right) -> Bool in
return left.1.id2 > right.1.id2
}
答案 0 :(得分:1)
我正在尝试对元组数组进行排序
但问题是您的tuples
不是数组。 (这是一种称为Zip2Sequence的东西。)解决方案是将其强制转换为数组:
var tuples = Array(zip(array1, array2))
现在您的原始代码将起作用:
let array1 = [MyClass1(id:4), MyClass1(id:3), MyClass1(id:2), MyClass1(id:1)]
let array2 = [MyClass2(id2:1), MyClass2(id2:2), MyClass2(id2:3), MyClass2(id2:4)]
var tuples = Array(zip(array1, array2)) // *
tuples = tuples.sorted { (left, right) -> Bool in
return left.1.id2 > right.1.id2
}
你的解决方案工作的原因是排序的序列产生一个数组。因此,您无法将数组重新分配给序列变量(tuples
),但您可以将其分配给不同的变量(tuples2
)。我的解决方案使用数组启动,因此生成的排序数组可以分配回同一个变量。
答案 1 :(得分:0)
您无法使用void allDiff(char** T, int taille)
,因为元组类型sorted()
不符合(MyClass1, MyClass2)
,因此分拣机不知道如何对元组进行排序。您无法添加一个可以增加一致性的扩展程序,因为元组无法扩展或符合协议。
但是,您可以使用Comparable
,这需要您提供一个闭包来定义元素之间的排序。
sorted(by:)