1

Swift 配列にオブジェクトの特定のインスタンスが含まれているかどうかを確認するにはどうすればよいですか? 次の簡単な例を考えてみましょう。

class Car {}

let mazda = Car()
let toyata = Car()

let myCars = [mazda, toyata]

myCars.contains(mazda) // ERROR!

Car調査の結果、クラスはEquatableプロトコルを採用しなければならないという結論に達しました。それは事実のようです:

class Car: Equatable {
    static func ==(lhs: Car, rhs: Car) -> Bool {
        return true
    }
}

その後myCars.contains(mazda)、実際に戻りtrueます。

ただし、の実装==は明らかに私が望んでいるものではありません。私が本当に返してほしいのは、次の質問への答えです:lhsrhs同じCarインスタンスですか?

本当にそんなに複雑ですか?

ありがとう!

4

2 に答える 2

3
=== 

Swift の operator は、2 つのオブジェクト参照が両方とも同じオブジェクト インスタンスを参照しているかどうかをチェックします。

したがって、次のEquatableようになります。

   static func ==(lhs: Car, rhs: Car) -> Bool {
        return lhs===rhs
    }

このアプローチはお勧めしません。Equatableの目的は、同じオブジェクトへの参照を評価することではありません。

于 2016-10-16T17:50:56.707 に答える
2

恒等演算子を使用する

static func ==(lhs: Car, rhs: Car) -> Bool {
   return lhs === rhs
}

またはなくてもEquatable

myCars.contains{ $0 === mazda }

編集:しかし、より良い解決策は、アイデンティティではなく等価を実装することです。たとえば、クラスのvendorandtypeプロパティ

static func ==(lhs: Car, rhs: Car) -> Bool {
   return lhs.vendor == rhs.vendor && lhs.type == rhs.type
}
于 2016-10-16T17:47:27.693 に答える