二元运算符' =='不能应用于两个操作数

时间:2016-01-06 18:59:50

标签: swift enums equatable

我有一个协议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
}

2 个答案:

答案 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 }); } }); });