2016-11-10 15 views
12

Przed zadaniem tego pytania przeszukałem powiązane pytania dotyczące Stackoverflow i znalazłem podobny: How to convert Any to Int in Swift.Jak przekonwertować Any do Int w Swift?

Moje wymogiem jest to, że nie mniej:

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

Moja potrzeba jeśli tResult?["result"] jest klasą String, chcę go mieć konwertować do Int też, zamiast nil.

W objective-c napisałem class method uzyskać konwertowane Int:

+ (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; 
} 

Czy to możliwe, aby napisać podobną class method użyciu Swift3?

Odpowiedz

4

odpowiedź Mniej gadatliwy:

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

Wyniki:

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

Nie jestem pewien, czy kompilator skompiluje tę linię szybko, –

+0

@ LucaD'Alberti, nie przetestowałem wydajności. Mam nadzieję, że kompilator jest wystarczająco inteligentny, aby skompilować linię wystarczająco szybko :) –

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 
} 

Coś jak to powinno działać

2

Try To

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 
} 

I nie potrzeba żadnego własnego class methods.

+0

Ten Principe pracuje dla mnie czytać NSNumber z plist jak każdy i konwertować do sznurka i obok Int. Dziękuję Ci. – OrdoDei