Xcode中的初学者问题,错误:‘any’类型的值没有下标

djmepvbi  于 2022-10-23  发布在  Swift
关注(0)|答案(1)|浏览(200)

我是XCode的新手,我正在学习一个购物清单程序的在线教程。我有这个错误,它出现两次,“类型为‘any’的值没有下标”。如果有人能帮助我或给我指导,我将不胜感激,谢谢!

private func seedItems() {
    let ud = UserDefaults.standard

    if !ud.bool(forKey: "UserDefaultsSeedItems") {
        if let filePath = Bundle.main.path(forResource: "seed", ofType: "plist"), let seedItems = NSArray(contentsOfFile: filePath) {
            // Items
            var items = [Item]()

            // Create List of Items
            for seedItem in seedItems {
                if let name = seedItem["name"] as? String, let price = seedItem["price"] as? Float { //this is where the error appears
                    print("\(name) - \(price)")

                    // Create Item
                    let item = Item(name: name, price: price)

                    // Add Item
                    items.append(item)
                }
            }

            print(items)

            if let itemsPath = pathForItems() {
                // Write to File
                if NSKeyedArchiver.archiveRootObject(items, toFile: itemsPath) {
                    ud.set(true, forKey: "UserDefaultsSeedItems")
                }
            }
        }
    }
}
sd2nnvve

sd2nnvve1#

NSArray是一个客观C数组。类型系统对NSArray的内容一无所知,因此它假定它们是类型Any
解决问题的捷径是将每一项都转换为正确的类型。

if let seedItemDict = seedItem as? Dictionary 
{
    if let name = seedItemDict["name"] 
    // etc
}
else 
{
    // Error the items were not dictionaries
}

然而,我注意到您使用的初始化器已被弃用,因此您应该寻找更好的方法来加载您的属性列表。
事实证明,您可以使用Decodable对象来解码属性列表。您应该考虑使用PropertyListDecoder

相关问题