2017-05-05 47 views
-1

我有下面的方法將值插入到字典中。在Swift 2.x中,它按原樣運行。當切換到Swift 3時,我得到「模糊引用成員下標'」錯誤。Swift 3.0錯誤:在設置字典值時對成員'下標'的模糊引用

任何人都可以幫助我理解爲什麼。由於

private func GetNames() -> AnyObject? { 
    var returnList : [NSDictionary] = [] 
    let list = self.Names as! [NSDictionary] 
    for name in list { 
     var dict : Dictionary<NSObject, AnyObject> = [:] 
     dict["id"] = name["id"]  // <-- ******Error******* 
     dict["name"] = name["name"] // <-- ******Error******* 
     returnList.append(dict as NSDictionary) 
    } 
    return returnList as AnyObject 
} 
+0

那是什麼。在名字[「id」]之後? –

+0

你是否試圖從名稱[「id」]訪問元素?那是什麼 。在名字[「id」]之後? –

+0

這是我輸入//評論時的拼寫錯誤 – Vince613

回答

1

在斯威夫特3 StringStructure類型,因此它不會與NSObject工作,你必須聲明字典這就是關鍵的類型是NSObject這是你得到的是錯誤的原因。要解決該錯誤,只需將字典類型更改爲[String:Any]表單[NSObject:AnyObject],然後您就可以開始了。

var dict : [String:Any] = [:] 

注:另外在斯威夫特不使用NSDictionaryNSArray使用SWIFT的原生型詞典和陣列。

1

發生此錯誤是因爲Swift 3需要知道所有通過鍵或索引進行下標的類型。

使用Foundation集合類型會適得其反,因爲它們缺少編譯器所需的類型信息。

返回可選AnyObject而不是獨特(非可選)[[String:Any]]也會適得其反。

解決方案是僅使用(儘可能)特定的(儘可能)本機Swift類型。

private func getNames() -> [[String:Any]] { 
    var returnList = [[String:Any]]() 
    let list = self.Names as! [[String:Any]] 
    for name in list { 
     var dict = [String:Any]() 
     dict["id"] = name["id"] 
     dict["name"] = name["name"] 
     returnList.append(dict) 
    } 
    return returnList 
} 

swiftier如果它保證這兩個鍵nameid總是存在

private func getNames() -> [[String:Any]] { 
    let list = Names as! [[String:Any]] 

    return list.map { ["id" : $0["id"]!, "name" : $0["name"]!] } 
} 
相關問題