2017-01-30 3 views
1

ich in Swift 3 meinen Code bin Umwandlung und ich erhalte diese Störung auf der Leitung:kann nicht einen Wert vom Typ SUBSCRIPT [[String: Alles]] mit einem Index vom Typ 'String' - Swift 3

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

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

Bitte lassen Sie mich wissen, wo ich falsch liege und lassen Sie mich wissen, wie ich das gleiche lösen.

Auch auf dieser Linie immer Fehler:

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? 

verstehen nicht, wo ich falsch

Fehler werde 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() 
       } 

Vielen Dank im Voraus.

Antwort

1

Ihr dicArray ist optional, also müssen Sie es mit ? (optional) oder ! (forcieren) umwickeln und dann Karte darauf aufrufen.

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

Der Teig Ansatz ist guard oder if let und wickelte den dicArray zu verwenden.

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) 

Oder Sie können wie sowohl die guard let Anweisung in einzelnen guard Anweisung hinzufügen.

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

Edit: Der Grund, warum Sie dieses Problem konfrontiert sind, weil sein können Sie NSDictionary und NSArray verwenden, wenn Sie schnellen nativen Typ verwenden wird es viel sein, dass Sie den Wert erhalten/zugreifen. Sie können UserID auf diese Weise erhalten.

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) 

Edit: Das Problem ist, müssen Sie die Art von Objekten sagen complier resultObjectItems Array haben, so versuchen, wie auf diese Weise.

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

Appreditae Ihre prompte Antwort!, Ich habe meine Frage bearbeitet und mit einer Abfrage auf andere Linie als auch können Sie es betrachten. ? und schlagen –

+0

@RaghavChopra Überprüfen Sie die bearbeitete Antwort für das –

+0

Dank für Ihre Antwort funktionierte es für mich Swift 3 Syntax sind verwirrend, wenn Sie beginnen, wird Ihre Hilfe im Falle von Hilfe benötigen –

Verwandte Themen