2017-01-30 46 views
1

我將我的代碼在斯威夫特3和我收到就行了這個錯誤:無法下標類型的值[字符串:任何]類型的「字符串」的指數 - 斯威夫特3

let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]] 
let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first! 

例外:Cannot subscript a value of type [[String:Any]] with an index of type 'String'

請讓我知道我要去哪裏錯了,讓我知道我如何解決相同的問題。

也越來越在這一行錯誤:

let user_id=String(((data as AnyObject).value(forKey: "UserLoginResult") as AnyObject).value(forKey: "UserID") as! Int) 


Exception: Optional chain has no effect expression already produced Any? 

不明白的地方我錯了

錯誤3:提前

if(!((self.serviceProvided!.value(forKey: "Weekly")! as AnyObject).isKind(of: NSNull.self))){ 
        let resultObject = self.serviceProvided!.value(forKey: "Weekly") as! NSDictionary 
        self.serviceProvicedListArray!.add(resultObject) 
        let resultObjectItems = self.serviceProvicedListArray!.value(forKey: "lstActType") 

        //print(resultObjectItems[0].count) 
        for i in 0..<resultObjectItems[0].count { 
        //for(var i=0; i<resultObjectItems[0].count; i += 1){ 
         //let resultObjectItem = resultObjectItems[0][i] as! NSDictionary 
         let resultObjectItem = resultObjectItems[0][i] as AnyObject 
         self.serviceProvicedList!.add(resultObjectItem) 
        } 

        //print(self.serviceProvicedList) 
        self.serviceProvidedTableView.reloadData() 
       } 

感謝。

回答

1

你的dicArray是可選的,所以你需要用?(可選)或!(強制)包裝它,然後調用它的地圖。

let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]] 
let count = dicArray?.map({ Int($0["lstActType"] as? String ?? "0")! }).first! 

麪糊的方法是使用guardif let和包裹dicArray

guard let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]] else { 
    print("Not array of dictionary") 
    return 
} 
guard let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first else { 
    return 
} 
print(count) 

或者你可以同時添加單guard聲明像guard let聲明。

guard let dicArray = serviceProvicedListArray?.objectEnumerator().allObjects as? [[String:Any]], 
     let count = dicArray.map({ Int($0["lstActType"] as? String ?? "0")! }).first else { 
    return 
} 
print(count) 

編輯:你都面臨這個問題的原因是因爲可能是你正在使用NSDictionaryNSArray,如果使用SWIFT的原生型將是大量容易讓你得到/訪問值。您可以像這樣獲得UserID

guard let dict = data as? [String:Any], 
     let loginDict = dict["UserLoginResult"] as? [String:Any], 
     let userId = loginDict["UserID"] as? Int else { 
    return 
} 
let strUserId = String(userId) 

編輯:問題是你需要告訴編譯對象resultObjectItems陣列具有的類型,所以嘗試這樣的方式。

if let resultObjectItems = self.serviceProvicedListArray!.value(forKey: "lstActType") as? [[[String:Any]]] { 
    for i in 0..<resultObjectItems[0].count {   
     let resultObjectItem = resultObjectItems[0][i] as AnyObject 
     self.serviceProvicedList!.add(resultObjectItem) 
    } 
} 
+0

讚賞您的快速反應!,我編輯了我的問題,並面對其他線上的查詢以及您可以看看它。 ?並建議 –

+0

@RaghavChopra檢查編輯的答案爲 –

+0

感謝您的反應,它爲我工作斯威夫特3語法令人困惑,當你開始時,需要你的幫助,如果有任何幫助 –

相關問題