2016-11-10 20 views
12

Trước khi đặt câu hỏi này, tôi đã tìm kiếm các câu hỏi liên quan đến Stackoverflow và tìm một câu hỏi tương tự: How to convert Any to Int in Swift.Làm thế nào để chuyển đổi Bất kỳ thành Int nhanh chóng?

Yêu cầu của tôi không phải là ít:

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

nhu cầu của tôi là nếu tResult?["result"] là một lớp String, tôi muốn nó được chuyển đổi sang Int quá, chứ không phải để nil.

Trong objective-c, tôi đã viết một class method để có được chuyển đổi 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; 
} 

Có thể viết thư tương tự class method sử dụng Swift3?

Trả lời

4

câu trả lời Ít verbose:

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

Kết quả:

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

Không chắc chắn nếu trình biên dịch sẽ biên dịch dòng đó nhanh chóng –

+0

@ LucaD'Alberti thực sự, tôi đã không kiểm tra hiệu suất. Tôi hy vọng trình biên dịch đủ thông minh để biên dịch dòng đủ nhanh :) –

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 
} 

Something như thế này nên làm việc

2

Hãy thử này

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 
} 

Và bạn không cần bất kỳ riêng class methods.

+0

Principe này làm việc cho tôi để đọc NSNumber từ plist như Bất kỳ và chuyển sang chuỗi và bên cạnh Int. Cảm ơn bạn. – OrdoDei

Các vấn đề liên quan