2016-11-10 5 views
12

Bevor ich diese Frage gestellt habe, habe ich die verwandten Fragen von Stackoverflow durchsucht und eine ähnliche gefunden: How to convert Any to Int in Swift.Wie konvertiert man Any in Int in Swift?

Meine Forderung ist nicht weniger:

let tResult = result as? [String:AnyObject] 
let stateCode = tResult?["result"] as? Int 

Mein Bedürfnis ist, wenn die tResult?["result"] a String Klasse, ich will es auch zu Int zu konvertieren sein, anstatt zu nil.

In objective-c, schrieb ich ein class method die Int umgewandelt zu bekommen:

+ (NSInteger)getIntegerFromIdValue:(id)value 
{ 
    NSString *strValue; 
    NSInteger ret = 0; 
    if(value != nil){ 
     strValue = [NSString stringWithFormat:@"%@", value]; 
     if(![strValue isEqualToString:@""] && ![strValue isEqualToString:@"null"]){ 
      ret = [strValue intValue]; 
     } 
    } 
    return ret; 
} 

Ist es möglich, ein ähnliches class method mit swift3 zu schreiben?

Antwort

4

Weniger ausführliche Antwort:

let key = "result" 
let stateCode = tResult?[key] as? Int ?? Int(tResult?[key] as? String ?? "") 

Ergebnisse:

let tResult: [String: Any]? = ["result": 123] // stateCode: 123 
let tResult: [String: Any]? = ["result": "123"] // stateCode: 123 
let tResult: [String: Any]? = ["result": "abc"] // stateCode: nil 
+1

Nicht sicher, ob der Compiler diese Zeile schnell kompilieren wird –

+0

@ LucaD'Alberti tatsächlich habe ich die Leistung nicht getestet. Ich hoffe, der Compiler ist schlau genug, um die Zeile schnell genug zu kompilieren :) –

2
if let stateCode = tResult["result"] as? String { 
    if let stateCodeInt = Int(stateCode){ 
     // stateCodeInt is Int 
    } 
}else if let stateCodeInt = tResult["result"] as? Int { 
    // stateCodeInt is Int 
} 

So etwas sollte

2

Diese

class func getIntegerFromIdValue(_ value: Any) -> Int { 
    var strValue: String 
    var ret = 0 
    if value != nil { 
     strValue = "\(value)" 
     if !(strValue == "") && !(strValue == "null") { 
      ret = Int((strValue as NSString ?? "0").intValue) 
     } 
    } 
    return ret 
} 
3
if 
    let tResult = result as? [String:AnyObject], 
    let stateCodeString = tResult["result"] as? String, 
    let stateCode = Int(stateCodeString) 
{ 
    // do something with your stateCode 
} 

Versuchen Sie arbeiten und Sie haben noch keine eigene class methods benötigen.

+0

Das Principe für mich arbeitet NSNumber von plist wie jeder zu lesen und zu bespannen und neben Int konvertieren. Vielen Dank. – OrdoDei