2016-09-25 78 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) 
    }) 
} 
相关问题