[英]Error: Type [AnyHashable: Any]? has no subscript members (Swift)
[英]Swift 3 ternary operator Error Type 'Any' has no subscript members
我有一個功能
func test (food_item_raw:NSArray){
for j in 0...food_item_raw.count-1{
let food_name = food_item_raw[j]["food_name"] as? String == nil ? "nil" : food_item_raw[j]["food_name"] as! String
let food_url = food_item_raw[j]["food_url"] as? String == nil ? "nil" : food_item_raw[j]["food_url"] as! String
let food_price = food_item_raw[j]["food_price"] as? String == nil ? "nil" : food_item_raw[j]["food_price"] as! String
let food_desc = food_item_raw[j]["food_desc"] as? String == nil ? "nil" : food_item_raw[j]["food_desc"] as! String
//let food_item = FoodItems(food_url: food_url, food_name: food_name, food_catagory: food_type,food_price: food_price, food_desc: food_desc)
//weakFoodArray.append(food_item)
}
}
在swift 2和swift 2.3中工作正常,但是在swift 3中我遇到錯誤Type 'Any' has no subscript members
這是屏幕截圖
為什么會發生?
Swift 3中的NSArray
被橋接到[Any]
。 因此food_item_raw[j]
類型為Any
。
這是您的Error Type 'Any' has no subscript members
。 Any
協議都是空協議,它什么也沒有,甚至沒有subscript
。
解
為了防止這種情況,只需添加一些類型,將NSArray
更改為[T]
,其中T
是Type,您的情況看起來像T == [String: String]
。 這也將使您免於在每一行中進行類型轉換。
您可以將代碼更改為此,例如:
func test (food_item_raw:[[String: String]]) {
for food_item in food_item_raw {
let food_name = food_item["food_name"] ?? "nil"
let food_url = food_item["food_url"] ?? "nil"
let food_price = food_item["food_price"] ?? "nil"
let food_desc = food_item["food_desc"] ?? "nil"
//let food_item = FoodItems(food_url: food_url, food_name: food_name, food_catagory: food_type,food_price: food_price, food_desc: food_desc)
//weakFoodArray.append(food_item)
}
}
而且,順便說一句,我用枚舉代替了索引,因為每行中的food_item_raw[j]
是多余的,看起來很傻。
同樣,巨大的復雜三元運算符也可以用Nil-Coalescing運算符 ( ??
)代替,它的作用相同,但更短。
問題出在您使用Objective-C類型的NSArray(在第一行)。 您需要將此事物強制轉換為它真正包含的任何元素類型的Swift數組。 看起來它的類型是[[String:Any]]
。 也許[[String:String]]
。
您所做的總是一個壞主意,現在Swift 3告訴您了。 這是斯威夫特。 使用Swift類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.