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]] ?? [:]