2017-01-30 38 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语法令人困惑,当你开始时,需要你的帮助,如果有任何帮助 –

相关问题