Binary operator '==' cannot be applied to two operands

前端 未结 2 1527
孤独总比滥情好
孤独总比滥情好 2021-02-12 09:34

I have a class with the protocol Equatable. The class looks like this:

class Item: Equatable {

    let item: [[Modifications: String]]

    init(it         


        
2条回答
  •  南旧
    南旧 (楼主)
    2021-02-12 10:10

    Update: SE-0143 Conditional conformances has been implemented in Swift 4.2.

    As a consequence, your code does compile now. And if you define Item as a struct

    struct Item: Equatable {
        let item: [[Modifications: String]]
    
        init(item: [[Modifications: String]]) {
            self.item = item
        }
    }
    

    then the compiler synthesizes the == operator automatically, compare SE-0185 Synthesizing Equatable and Hashable conformance


    (Pre Swift 4.1 answer:)

    The problem is that even if == is defined for the dictionary type [Modifications: String], that type does not conform to Equatable. Therefore the array comparison operator

    public func ==(lhs: [Element], rhs: [Element]) -> Bool
    

    cannot be applied to [[Modifications: String]].

    A possible concise implementation of == for Item would be

    func ==(lhs: Item, rhs: Item) -> Bool {
        return lhs.item.count == rhs.item.count 
               && !zip(lhs.item, rhs.item).contains {$0 != $1 }
    }
    

    Your code compiles for [[String: String]] – if the Foundation framework is imported, as @user3441734 correctly said – because then [String: String] is automatically converted to NSDictionary which conforms to Equatable. Here is a "proof" for that claim:

    func foo(obj :[T]) {
        print(obj.dynamicType)
    }
    
    // This does not compile:
    foo( [[Modifications: String]]() )
    
    // This compiles, and the output is "Array":
    foo( [[String: String]]() )
    

提交回复
热议问题