2016-09-19 19 views
2

Swift 3.0では、タイプ[[String: AnyObject]]との2つのアイテムを比較しようとすると、奇妙なエラーが発生します。だから、彼らのうちの1つはアンラップされており、もう1つはアンラップされていません。Swift 3.0バイナリ演算子 '=='を適用できません

ので比較は次のようになります。

let smth: [[String: AnyObject]] = [["key": "Value"]] 
let smth2: [[String: AnyObject]]? = someFunctionThatReturnsAnOptionalArrayOfDictionaries() 

if smth == smth2! { 
    print("Equal") 
} 

エラーは言う:Binary operator '==' cannot be applied to operands of type '[[String : AnyObject]]' and '[[String : AnyObject]]!'

スウィフト3でこれを行うための正しい方法は何ですか?

+0

奇妙なエラーを指定できますか? –

+0

追加、申し訳ありません。 – Majster

+0

どのXcodeをお使いですか? –

答えて

4

配列や辞書を直接比較することはできません(演算子のオーバーロードなし)ので少し難解です。

あなたが直面する可能性がもう一つの問題は、スウィフト3で除去して、オプションおよび非オプションの比較、である(のみ<>==!=ためまだ動作!):

Swift Evolution - Proposal #0121

私がそれを動作させるためにしたのは、最初にif letのオプションをアンラップしてから、elementsEqualと最初に配列を比較し、次に辞書を比較しました。

let smth: [[String: AnyObject]] = [["key": "Value" as AnyObject]] 
let smth2: [[String: AnyObject]]? = nil 

if let smth2 = smth2, smth.elementsEqual(smth2, by: { (obj1, obj2) -> Bool in 
    return obj1.elementsEqual(obj2) { (elt1, elt2) -> Bool in 
     return elt1.key == elt2.key && elt1.value === elt2.value 
    } 

}) { 
    print("Equal") 
} 

もう一つの問題は、あなたが値としてAnyObjectを使用しているので、あなたがそれらを直接比較することはできません、です。その理由は私が===を使ってオブジェクト比較のリファレンスが同じかどうかをチェックする理由です。これがあなたの望むものかどうかは分かりません。

+3

うわー..ちょうどうわー。これは、迅速なオブジェクトに変換された2つのJSONオブジェクトを比較するのと同じくらいシンプルなもののコードの導入を導入します。しかし、私は本当に選択肢がないと思う。 – Majster

+0

正確に。たぶんJSON文字列を比較するのは簡単でしたか? –

+0

Nahさん、APIからの応答を受け取ったらすぐに変換されますが、これはコントローラの1つのロジックです。それをJSON文字列にシリアライズすれば、どこにいてもパフォーマンスが浪費されるだけです。 – Majster

2

This SO回答には、この問題の解決策が「Xcode 8 beta 6•Swift 3」という小見出しに含まれています。特に

注:すべての辞書のキーと値上記の例では

は同じタイプです。 [String:Any]タイプの2つの辞書を比較しようとすると、Xcodeはバイナリ演算子==を2つの[String:Any]オペランドに適用できないと不平を言います。 ...しかし、NSDictionary初期化子を使用して==演算子の機能を拡張することができます:

+0

うわー..どのように不自由な:)これを行うための最善の方法は何ですか?私はAPIから返されたJSONオブジェクトの配列に対して '[[String:AnyObject]]'型を使用しています。オブジェクトは常に文字列か数字かそのようなものを値として持ちます。何か案は? – Majster

+0

どうかその同じ質問に[他の答え](http://stackoverflow.com/a/32365828/2466193)、私は。 AnyObjectの代わりにNSObjectを使用しますか? –

関連する問題