2016-05-13 23 views
2

は、私はクラスEmailを持って期待通りに動作していない配列比較は

let newEmails = emailsJsonObjects.map({ return Email(JSON: $0)! }).sort({ $0.0.email < $0.1.email }) 

let currentEmails = (self.emails as! [Email]).sort({ $0.0.email < $0.1.email }) 

を両方が一つの要素を持っている、と彼らは同じ持っていますemailemailType、ここで私はそれらを比較することによって、持っているものです:

(lldb) po newEmails.count 
1 

(lldb) po currentEmails.count 
1 

(lldb) po newEmails == currentEmails 
false 

(lldb) po newEmails[0] == currentEmails[0] 
true 

何か不足していますか?比較は異なっていますか?

+2

'newEmails == currentEmails'は、2つの配列が同じ配列であるかどうかを尋ねます。 'newEmails [0] == currentEmails [0]'は、 'newEmails'のインデックス0の電子メールが' currentEmails'のインデックス0の電子メールと同じかどうかを尋ねます。 – Paulw11

+0

Paulw11:私もそれを考えましたが、これによると(http://stackoverflow.com/a/27580740)、実際にはすべての配列要素を実行します。そして私はプレイグラウンドでいくつかのテストを行いました。実際には期待通りに動作しますが、この場合は動作しません。 – dccarmo

+0

おそらくそれはデバッガです。 – Paulw11

答えて

3

問題は、オブジェクトがNSObjectから継承されるため、配列はisEqual()を使用して配列要素の比較を行います。クラス定義に次のオーバーライドを追加してください。

override func isEqual(object: AnyObject?) -> Bool 
{ 
    if let rhs = object as? Email 
    { 
     return self.email == rhs.email && self.emailType == rhs.emailType 
    } 
    return false 
} 

これはすべて問題ありません。

+0

面白いことに、 '=='関数は実行時に 'isEqual:'にマップされません。それは知らなかった。私はそれが '参照 '型と'値 '型とで何か関係があると思っていました。情報をありがとう。 –

+1

@RoboticCatある意味では。デフォルトの 'isEqual'は参照を比較し、それをオーバーライドしなければ起こります。 – JeremyP

+0

それでした!うわーとても奇妙。 @RoboticCatが述べたように、Swiftクラスのサブクラス「NSObject」を作ることは、副作用をもたらす。面白い。助けてくれてありがとう! – dccarmo