2016-09-25 40 views
1

Iveは可能な組み合わせで何時間も試してみましたが、これを動作させることはできません。タイプ 'any'には添え字メンバーがありません。

私の機能:

func allItems() -> [TodoItem] { 
    let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) ?? [:] 
    let items = Array(todoDictionary.values) 

    return items.map({TodoItem(
     deadline: $0["deadline"] as! Date, 
     title: $0["title"] as! String, 
     UUID: $0["UUID"] as! String!, 
     description: $0["description"] as! String, 
     imageSavePath: ($0["imageSavePath"] as! String), 
     isItComplete: $0["isItComplete"] as! Bool 
    )}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in 
     (left.deadline.compare(right.deadline) == .orderedAscending) 
    }) 
} 

はどれが 'は添字のメンバーを持っていない私にエラー「タイプ' を与えます。 私が研究して変更しようとしている:

func allItems() -> [TodoItem] 

func allItems() -> [Any:[TodoItem]] 

には、しかし、これは「任意のプロトコルをハッシュ化するために適合していない型」というエラーが発生します。これは下がる正しい線ですか?

私のMacBookがウィンドウの外に出る前に助けてください.....!

+0

が設計ミスではないですか?辞書は、キーと値のペアを持つオブジェクトです。あなたのマッピングは、各** value **がそれ自体私が疑う辞書です。 – vadian

+0

実際に何を返そうとしていますか、配列か辞書ですか? – Alexander

+0

これは、スウィフト3.0の前に完全に機能したので、これは設計ミスではないと思います。目的は、DueDateでソートされた 'ToDoItems'の配列を返すことです。 – MartynE23

答えて

2

は、変数の型の世話をします。

dictionary(forKey:)[String: Any]となるので、todoDictionary[String: Any]です。

(古いスウィフトでは、一般的な辞書の値タイプがAnyObjectとしてインポートされましたが、今ではAnyです。)

はあなたが唯一の値を取得し、配列にそれを作っているので、itemsArray<Any>です。

次にmapitemsに適用しているので、$0Anyです。

したがって、Anyに添字を含むメソッドは適用できません。


あなたは$0["deadline"]か何かを適用する必要があり、値が異なる可能性がある場合は、$0のタイプはスウィフト3にAnyで表される混合そのキーの種類Stringとその値のタイプ、と辞書をする必要があります。 [String: Any]すべき

タイプ$0ニーズ、itemsのタイプはArray<[String: Any]>(別名[[String: Any]])する必要があるので。 todoDictionaryニーズの値のタイプは[String: Any]であることを意味し

は、そのキーの種類は、すでにStringに拘束されているので、todoDictionaryのタイプは[String: [String: Any]]する必要があります。


まとめ、これにあなたのallItems()の最初の行を変更します。

let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) as? [String: [String: Any]] ?? [:] 
+0

は治療した....ありがとう! – MartynE23

0

あなたは辞書の外にvaluesしか持っていません。これらのAnyインスタンスに文字列を添字しようとしています。これは、AnyインスタンスがDictionariesであることが保証されているか、Stringでサブスクリプトされていることが保証されていないためです。

あなたの質問はかなり不足しており、実際に達成しようとしているものに変換されません。私はここで、あなたが[String: TodoItem][String: [String: Any]]をマップしようとしている疑いがある、あなたの問題は、次のとおりです。

func allItems() -> [TodoItem] { 
    let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) ?? [:] //inferred type: [String: Any] 
    let items = Array(todoDictionary.values) //inferred type [Any] 

    return items.map({TodoItem(
     deadline: $0["deadline"] as! Date, //[Any] can only be subscripted by indices, not by string. 
     title: $0["title"] as! String, 
     UUID: $0["UUID"] as! String!, 
     description: $0["description"] as! String, 
     imageSavePath: ($0["imageSavePath"] as! String), 
     isItComplete: $0["isItComplete"] as! Bool 
    )}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in 
     (left.deadline.compare(right.deadline) == .orderedAscending) 
    }) 
} 
関連する問題