我有一个协议Equatable
的课程。该课程如下:
class Item: Equatable {
let item: [[Modifications: String]]
init(item: [[Modifications: String]]) {
self.item = item
}
}
func ==(lhs: Item, rhs: Item) -> Bool {
return lhs.item == rhs.item
}
但是这给了我错误(见标题)。 item
属性之前是[[String: String]]
,没有问题,我不知道如何解决这个问题。我试着谷歌搜索和搜索所有的SO但没有运气..
枚举只是一个简单的基础:
enum Modifications: Int {
case Add = 1
case Remove = 2
case More = 3
case Less = 4
}
答案 0 :(得分:18)
更新: SE-0143 Conditional conformances已在 Swift 4.2中实施。
因此,您的代码现在可以编译。如果您将Item
定义为 struct
struct Item: Equatable {
let item: [[Modifications: String]]
init(item: [[Modifications: String]]) {
self.item = item
}
}
然后编译器自动合成==
运算符,
比较SE-0185 Synthesizing Equatable and Hashable conformance
(Pre Swift 4.1回答:)
问题是即使为字典类型定义了==
[Modifications: String]
,该类型不符合
Equatable
。因此数组比较运算符
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool
无法应用于[[Modifications: String]]
。
==
Item
的简明实现可能是
func ==(lhs: Item, rhs: Item) -> Bool {
return lhs.item.count == rhs.item.count
&& !zip(lhs.item, rhs.item).contains {$0 != $1 }
}
您的代码将编译为[[String: String]]
- 如果是基金会
导入框架,正如@ user3441734正确说 - 因为[String: String]
自动转换为NSDictionary
符合
Equatable
。以下是该声明的“证据”:
func foo<T : Equatable>(obj :[T]) {
print(obj.dynamicType)
}
// This does not compile:
foo( [[Modifications: String]]() )
// This compiles, and the output is "Array<NSDictionary>":
foo( [[String: String]]() )
答案 1 :(得分:3)
在==
Item
对象的[[Modifications: String]]
函数中,您需要进一步指定如何比较两种类型的词典数组(具体来说,两种类型的item
)。
以下工作解决方案将元素==
数组元素(字典除外)进行比较,func ==(lhs: Item, rhs: Item) -> Bool {
if lhs.item.count == rhs.item.count {
for (i, lhsDict) in lhs.item.enumerate() {
if lhsDict != rhs.item[i] {
return false
}
}
return true
}
else {
return false
}
}
class Item : Equatable {
let item: [[Modifications: String]]
init(item: [[Modifications: String]]) {
self.item = item
}
}
仅当数组包含相同数量的字典时才返回true,并且所有条目都相似< em>并在dictionares数组中以相同的方式排序
==
您可能希望将其修改为您实际想要用于比较的表单,但我希望您能得到它的主旨。
另请注意,如果在游乐场中进行测试,请务必将func ==(lhs: Item, rhs: Item) -> Bool { ..
函数定义Equatable
置于类定义之前,否则会出现错误不符合$(document).ready(function() {
$(document).mousemove(function(e) {
var w = $(window).width();
if ((e.pageX) <= (w/2)) {
console.log("left");
// code for changing the mouse cursor
// ....
// code for calling prev/next slide
$(document).on("click", function(){
// slide.next/prev
});
}
else {
console.log("right");
// code for changing the mouse cursor
// ....
// code for calling prev/next slide
$(document).on("click", function(){
// slide.next/prev
});
}
});
});
。