2016-05-26 18 views
4

の配列をintに文字列を変換するためのマップでエラーをスローするにはどうすれば文字列番号形式例外

var str = "1 2 3 4" 

を持っていると私は[INT]に変換します。私の文字列が続いて

var invalid = " 1 a 4" 

ある今、何場合

let intArray = str.characters.split {$0 == " "}.map(String.init).map { Int($0)!} 

に従うように行うことができ、プログラムは、私は数とスローをチェックできるようにする必要があり

fatal error: unexpectedly found nil while unwrapping an Optional value 

とクラッシュします地図の数値書式エラーです。

答えて

2

あなたはthrows、try-throw、do-try-catchおよびguard(if)を使用できます。ここにコードです

var invalid = " 1 a 4" 
    let intArray: [Int] 
    do { 
     intArray = try getIntArray(invalid, delimiter: " ") 
    }catch let error as NSError { 
     print(error) 
     intArray = [] 
    } 


    func getIntArray(input:String, delimiter:Character) throws -> [Int] { 
     let strArray = input.characters.split {$0 == delimiter}.map(String.init) 
     let intArray = try strArray.map { 
      (int:String)->Int in 
      guard Int(int) != nil else { 
       throw NSError.init(domain: " \(int) is not digit", code: -99, userInfo: nil) 
      } 
      return Int(int)! 
     } 
    return intArray 
    } 

getIntArray関数では、まず入力文字列を文字列配列に変換します。 文字列配列をint配列に変換するときに、マップクロージャ関数のパラメータを拡張して、数字形式のチェックと「ガード」を使用したエラーをスローします。それは

if Int(int) == nil { 
     throw NSError.init(domain: " \(int) is not digit", code: -99, userInfo: nil) 
    } 
1

よりもむしろNSError種類を投げて利用できない、あまりにもあれば、あなたがあなた自身のスウィフトを作成できる「場合」

「ガード」はと交換することができるネイティブenumあなたの列挙は、エラーが含まれているErrorTypeに準拠あなたが明示的に処理したい場合。例えば。 do-try-catchコンストラクト内

enum MyErrors : ErrorType { 
    case NumberFormatError(String) 
} 

/* throwing function attempting to initialize an 
    integer given a string (if failure: throw error) */ 
func strToInt(str: String) throws -> Int { 
    guard let myInt = Int(str) else { throw MyErrors.NumberFormatError(str) } 
    return myInt 
} 

使用例:

func strAsIntArr(str: String) -> [Int]? { 
    var intArr: [Int] = [] 
    do { 
     intArr = try str.characters.split {$0 == " "} 
      .map(String.init) 
      .map { try strToInt($0) } 
    } catch MyErrors.NumberFormatError(let faultyString) { 
     print("Format error: '\(faultyString)' is not number convertible.") 
     // naturally you could rethrow here to propagate the error 
    } catch { 
     print("Unknown error.") 
    } 
    return intArr 
} 

/* successful example */ 
let myStringA = "1 2 3 4" 
let intArrA = strAsIntArr(myStringA) 
    /*[1, 2, 3, 4] */ 

/* error throwing example */ 
let myStringB = "1 b 3 4" 
let intArrB = strAsIntArr(myStringB) 
    /* [], Format error: 'b' is not number convertible. */