2016-10-04 25 views
0

我有一個函數斯威夫特3三元運算錯誤類型「任何」無標會員

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) 

    } 
} 

這是工作的罰款斯威夫特2和SWIFT 2.3,但在迅疾3我得到錯誤Type 'Any' has no subscript members

這裏是截圖

code screen shot

+0

我不認爲這是一個三元運算符問題。我猜如果你寫'prinf(food_item_raw [j] [「food_name」])'你會得到同樣的問題。我想說,你可能必須(也可能更清楚):'讓foodObject = food_item_raw [j]作爲NSDictionary'(或者像[[String:Any]'同化),然後'let food_name = foodObject [「food_name 「]爲? String == nil? 「nil」:foodObject [「food_name」] as! String' – Larme

回答

3

爲什麼會發生?

NSArray in Swift 3 is bridged to [Any]。 所以food_item_raw[j]有型號Any

而這裏是您的Error Type 'Any' has no subscript membersAny是空協議,它什麼都沒有,甚至沒有subscript

解決方案

爲了防止這種情況只需添加一些類型,改變NSArray[T],其中T是類型,你的情況下,它看起來像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 Operator??)替換,它可以做同樣的事情,但方法更短。

+0

so so basic NSArray is equivalent to [[String:String]]?是不是 –

+0

在你的情況下,在這個功能是的,它是。或者,更加正確:在你的情況下,你應該使用'[[String:String]]'而不是'NSArray'。 – user28434

+0

好的,還有一個問題,如果food_item [「food_name」]返回零然後呢?這個food_name =「nil」(零作爲字符串) –

0

的問題是在你使用的Objective-C型的NSArray(在第一行)。你需要把這個東西轉換成它真正包含的任何元素類型的Swift數組。看起來它的類型可能是[[String:Any]]。或者可能是[[String:String]]

你在做什麼總是一個糟糕的主意,現在Swift 3告訴你這麼做。這是Swift。使用Swift類型。