2016-09-25 80 views
1

我試了幾個小時,每種可能的組合,並不能得到它的工作。類型'任何'沒有下標成員與地圖的錯誤

我的功能:

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

還沒有一個設計錯誤?字典中帶有鍵/值對的對象。你的映射只適用於每個**值**本身就是一個我懷疑的詞典。 – vadian

+0

你究竟想要返回什麼,數組或字典? – Alexander

+0

這在swift 3.0之前完美運行,所以我不認爲這是一個設計錯誤。目標是返回由DueDate排序的'ToDoItems'數組。 – MartynE23

回答

2

就拿變量類型的護理。

dictionary(forKey:)返回[String: Any],所以todoDictionary[String: Any]

你僅檢索值,並將其製作成陣列(在舊斯威夫特,通用字典的值類型是進口爲AnyObject,但現在它的Any。),所以itemsArray<Any>

然後你申請mapitems,所以$0它是Any

因此,您不能使用任何方法,包括下標Any


如果您需要申請$0["deadline"]什麼和值可能會有所不同,中$0類型必須是一個詞典,其主要類型String及其價值型混合,這是由Any斯威夫特卡倫特3表示。

類型$0需要是[String: Any],所以需要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: [String: Any]][String: TodoItem],這裏是你的問題:

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) 
    }) 
} 
相關問題