type 'any' has no subscript members 地图错误
type 'any' has no subscript members error with map
我已经尝试了几个小时的每一种可能的组合,但无法让它发挥作用。
我的函数:
func allItems() -> [TodoItem] {
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) ?? [:]
let items = Array(todoDictionary.values)
return items.map({TodoItem(
deadline: [=11=]["deadline"] as! Date,
title: [=11=]["title"] as! String,
UUID: [=11=]["UUID"] as! String!,
description: [=11=]["description"] as! String,
imageSavePath: ([=11=]["imageSavePath"] as! String),
isItComplete: [=11=]["isItComplete"] as! Bool
)}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
给我错误“类型 'Any' 没有下标成员。
我已经研究并尝试改变:
func allItems() -> [TodoItem]
至
func allItems() -> [Any:[TodoItem]]
然而,这引发了 'Type Any does not conform to Hashable protocol' 的错误。这是正确的路线吗?
请帮助.....在我的 macbook 出现之前 window!
您只从字典中取出 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: [=10=]["deadline"] as! Date, //[Any] can only be subscripted by indices, not by string.
title: [=10=]["title"] as! String,
UUID: [=10=]["UUID"] as! String!,
description: [=10=]["description"] as! String,
imageSavePath: ([=10=]["imageSavePath"] as! String),
isItComplete: [=10=]["isItComplete"] as! Bool
)}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
注意变量的类型。
dictionary(forKey:)
returns[String: Any]
,所以todoDictionary
是一个[String: Any]
.
(在旧的 Swift 中,通用字典的值类型被导入为 AnyObject
,但现在是 Any
。)
您仅检索值并将其制成数组,因此 items
是一个 Array<Any>
。
那么你正在将 map
应用到 items
,因此其中的 [=21=]
是一个 Any
.
因此,您不能将包括下标在内的任何方法应用于Any
。
如果您需要应用 [=24=]["deadline"]
或其他东西并且值可能不同,[=21=]
的类型需要是一个字典,其键类型 String
和值类型混合, 由 Swift 中的 Any
表示 3.
类型 [=21=]
需要为 [String: Any]
,因此 items
的类型需要为 Array<[String: Any]>
(又名 [[String: Any]]
)。
也就是说todoDictionary
的Value类型需要是[String: Any]
,它的Key类型已经被约束为String
,所以todoDictionary
的类型需要是[String: [String: Any]]
.
结论,把你的allItems()
的第一行改成这样:
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) as? [String: [String: Any]] ?? [:]
我已经尝试了几个小时的每一种可能的组合,但无法让它发挥作用。
我的函数:
func allItems() -> [TodoItem] {
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) ?? [:]
let items = Array(todoDictionary.values)
return items.map({TodoItem(
deadline: [=11=]["deadline"] as! Date,
title: [=11=]["title"] as! String,
UUID: [=11=]["UUID"] as! String!,
description: [=11=]["description"] as! String,
imageSavePath: ([=11=]["imageSavePath"] as! String),
isItComplete: [=11=]["isItComplete"] as! Bool
)}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
给我错误“类型 'Any' 没有下标成员。 我已经研究并尝试改变:
func allItems() -> [TodoItem]
至
func allItems() -> [Any:[TodoItem]]
然而,这引发了 'Type Any does not conform to Hashable protocol' 的错误。这是正确的路线吗?
请帮助.....在我的 macbook 出现之前 window!
您只从字典中取出 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: [=10=]["deadline"] as! Date, //[Any] can only be subscripted by indices, not by string.
title: [=10=]["title"] as! String,
UUID: [=10=]["UUID"] as! String!,
description: [=10=]["description"] as! String,
imageSavePath: ([=10=]["imageSavePath"] as! String),
isItComplete: [=10=]["isItComplete"] as! Bool
)}).sorted(by: {(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
注意变量的类型。
dictionary(forKey:)
returns[String: Any]
,所以todoDictionary
是一个[String: Any]
.
(在旧的 Swift 中,通用字典的值类型被导入为 AnyObject
,但现在是 Any
。)
您仅检索值并将其制成数组,因此 items
是一个 Array<Any>
。
那么你正在将 map
应用到 items
,因此其中的 [=21=]
是一个 Any
.
因此,您不能将包括下标在内的任何方法应用于Any
。
如果您需要应用 [=24=]["deadline"]
或其他东西并且值可能不同,[=21=]
的类型需要是一个字典,其键类型 String
和值类型混合, 由 Swift 中的 Any
表示 3.
类型 [=21=]
需要为 [String: Any]
,因此 items
的类型需要为 Array<[String: Any]>
(又名 [[String: Any]]
)。
也就是说todoDictionary
的Value类型需要是[String: Any]
,它的Key类型已经被约束为String
,所以todoDictionary
的类型需要是[String: [String: Any]]
.
结论,把你的allItems()
的第一行改成这样:
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) as? [String: [String: Any]] ?? [:]