2016-04-25 18 views
0

これは簡単な質問ですが、解決策を見つけるのに問題があります。Swift: 'String'型の値を期待される引数型 '@noescape(AnyObject)throws - > Bool'に変換できません。

Swift 2.2では、このエラーが発生しています。

ここではコードです -

は、型の値が期待引数の型 に '文字列' '>ブール@noescape(ANYOBJECT)スロー' を変換できません。

var tableDataSectionsDict: CHOrderedDictionary? 
if !tableDataSectionsDict!.allKeys.contains("Yesterday") { 
    tableDataSectionsDict!.insertObject(YesterdayArray, forKey: "Yesterday", atIndex: count) 
} 

enter image description here

私はここで何をしないのですか?誰かがそれに光を当てることはできますか?

+1

'contains'関数の定義を見てください。それは、ストリングではなく、クロージャーを期待しています。 –

+1

@AlexanderDoloz 2つの 'contains'関数があります。 1つは閉包を期待し、1つは要素を期待する。これは 'AnyObject'の辞書なので、型推論は文字列を渡すと混乱するかもしれません。 – NobodyNada

+0

OPは 'CHOrderedDictionary'を使用します。たぶん1つの 'contains'関数しかありません:) –

答えて

4

私はCHOrderedDictionarythis CHOrderedDictionaryであると仮定しています。その場合、Objective-Cタイプで、Swiftにブリッジしています(私が間違っていれば修正してください)。

利用可能な2つのcontains機能がある:

extension SequenceType where Generator.Element : Equatable { 
    /// Returns `true` iff `element` is in `self`. 
    @warn_unused_result 
    public func contains(element: Self.Generator.Element) -> Bool 
} 

extension SequenceType { 
    /// Returns `true` iff an element in `self` satisfies `predicate`. 
    @warn_unused_result 
    public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool 
} 

CHOrderedDictionaryのキーと値は、スウィフトにAnyObjectにObjective-Cでidから変換されるが。 AnyObjectEquatableに準拠していないため、最初のcontains機能を使用することはできません。あなたは本当にしたい場合Equatable要素の種類を可能にするために、おそらくCHOrderedDictionaryの周りにラッパーを書くことができます。

ここで最も速い解決方法は、contains(第2のcontains)のより一般的なバージョンを使用することです。コードでは、次のようになります。

// contains will iterate over the entire allKeys array. $0 is the key at each iteration. 
let containsKey = tableDataSectionsDict!.allKeys.contains { return $0 as? String == "Yesterday" } 
if !containsKey { 
    //... 
} 
+0

はい、あなたは正しいです。私はこのCHOrderedDictionary Objective-Cクラスのためのヘッダーを使用しています。 コード例のおかげです。それは完璧に働いた。 –

関連する問題