0

Swift のindexOf機能との一貫性のない動作に直面しているようです。

indexOfSwift には次の 2 つの関数があり
ます 。Equatablearray.indexOf(obj)
array.indexOf{$0 == obj}

演算子が定義されているNSObjectサブクラスがあり==ます。つまり、に準拠しているEquatableため、両方の関数がまったく同じように機能すると想定しています(例のクロージャーを使用)。

ただし、この1stメソッドは一貫性のない動作をします。特にnil、インスタンスが配列に存在しないオブジェクトで呼び出されたときに戻ります。

問題を説明するために、コメント付きのサンプルコードを提供します。

class EqObj: NSObject {
  let value: Int
  init(value: Int) {
    self.value = value
  }
}

func ==(lhs: EqObj, rhs: EqObj) -> Bool{
  return lhs.value == rhs.value
}

var array = [Obj(value: 1), Obj(value: 3), Obj(value: 5)]
var object = Obj(value: 5)

// returns nil, should return 2 - incorrect
array.indexOf(object) // Instance is not present
// returns 2, correct
array.indexOf(array.last!) // Instance is present
// returns 2, correct
array.indexOf{$0 == object} // Instance is not present, predicate
// returns non-empty array, correct
array.filter{$0 == object} // Instance is not present, predicate

NSObjectこの問題は、サブクラスでのみ再現可能です。メソッドに変更Obj: NSObjectすると、期待どおりに動作します。つまり、戻ります。Obj: EquatableindexOf()2

問題は、これをバグと見なすことができるかどうかです。

私の仮定は、オーバーロードされた演算子ではなく、メソッドをarray.indexOf(object)呼び出すことです。isEqualNSObject==

私の解決策: 私は使用しますarray.indexOf{$0 == object}

4

1 に答える 1