2016-09-17 9 views
0

Ich versuche, meine Arrays mit Daten in JSONArray, die ich vom Server erhalten zu füllen und ich mache das mit diesem Code (SWIFT 3 Xcode 8):kann nicht Wert vom Typ ‚_SwiftValue‘ werfen Fehler

func parseReservationJson(_ anyObject:Array<AnyObject>){ 
      nodes.removeAll() 
      reservations.removeAll() 
      for anyObj in anyObject{ 
       let client_name = (anyObj["client_name"] as? String) ?? "" 
       let client_family = (anyObj["client_family"] as? String) ?? "" 
       let ft_of_time = ((anyObj["ft_of_time"] as AnyObject as! NSString).substring(to: 5) as NSString) 
      } 
    } 

Aber ich immer diese Fehlermeldung für die letzte Zeile von for Aussage:

Could not cast value of type '_SwiftValue' (0x112d8a898) to 'NSString' (0x11003eab8). 

ich will nicht Abhängigkeit verwenden für JSON zu konvertieren. Was ist falsch?

+0

Was ist '_SwiftValue'? Sie werden das Ergebnis von 'anyObj [" ft_of_time "]' in 'NSString' umwandeln und der Compiler sagt, dass Sie das nicht können. Und benutze den nativen Swift 'substringTo'. Ich weiß, dass es schwieriger ist, den richtigen Index zu bekommen, aber es ist zuverlässiger. – vadian

+0

Ich würde nicht fragen, ob ich die Antwort wusste! Ich habe keine Ahnung, warum ich diesen Fehler bekomme, wenn ich 'AnyObject' in' NSString' umwandele @vadian –

+0

OK, nächste Frage: Was ist der tatsächliche Typ des Ergebnisses von 'anyObj [" ft_of_time "]'? – vadian

Antwort

1

Die Fehlerursache ist, dass Swift 3 AnyObject? nicht direkt an Foundation NSString gegossen werden kann.

Sie könnten

let ft_of_time = ((anyObj["ft_of_time"] as! String as NSString).substring(to: 5) as NSString) 

schreiben Aber ich empfehle die gesamte Linie mit

let ftOfTime = anyObj["ft_of_time"] as! String 
let ft_of_time = ftOfTime.substring(to:ftOfTime.index(ftOfTime.startIndex, offsetBy: 5)) as NSString 

Es macht das gleiche zu ersetzen, aber es verwendet native Swift API. Außer der endgültigen Besetzung zu NSString (wenn überhaupt erforderlich) gibt es keine Art Casting hin und her.

+0

der Code war mit Swift 2 arbeiten, aber nach der Konvertierung zu Swift 3 hörte auf zu arbeiten –

+0

'NSString' ist Stiftung aber' String' ist nicht? Was ist dann "String"? – Honey

+0

'String' ist ein systemeigener Swift-Typ, eine Struktur mit Semantik des Werttyps (im Gegensatz zu Foundation 'NSString', der der Referenztyp ist). Es ist dem 'NSString' sehr ähnlich, hat aber ein paar verschiedene Funktionen. Aus Kompatibilitätsgründen kann 'String' leicht mit' NSString' überbrückt werden. – vadian

0

Sie können String-NSString wie

konvertieren
let swiftString:String = "Swift style string" 
let objCString:NSString = NSString(string:swiftString) 

so werfen zuerst Ihre string zu nsstring richtig, dann können Sie methods von nsstring

2

Die schlechte Punkt hier verwenden befindet:

anyObj["ft_of_time"] as AnyObject 

(Bitte überprüfen Sie this.)

Wenn Sie sicher sind anyObj["ft_of_time"] vom Typ NSString, einfach as! verwenden, sonst sollten Sie verwenden Optional Bindung:

if let rawFt_of_time = anyObj["ft_of_time"] as? NSString { 
    let ft_of_time = Utils.convert_string(string: rawFt_of_time.substring(to: 5) as NSString) 
    //Use ft_of_time here... 
} 

nicht as AnyObject Verwenden Sie den Compiler zum Schweigen zu bringen ...

Verwandte Themen