Swift2 如何在映射中将数字格式异常的字符串转换为int数组时引发错误

Swift2 如何在映射中将数字格式异常的字符串转换为int数组时引发错误,swift2,Swift2,我有一根绳子 var str = "1 2 3 4" 我想把它转换成[Int]。可以按如下方式进行 let intArray = str.characters.split {$0 == " "}.map(String.init).map { Int($0)!} 现在,如果我的字符串是 var invalid = " 1 a 4" 然后,该程序将崩溃 fatal error: unexpectedly found nil while unwrapping an Optional value

我有一根绳子

var str = "1 2 3 4"
我想把它转换成[Int]。可以按如下方式进行

let intArray = str.characters.split {$0 == " "}.map(String.init).map { Int($0)!}
现在,如果我的字符串是

var invalid = " 1 a 4"
然后,该程序将崩溃

fatal error: unexpectedly found nil while unwrapping an Optional value

我需要能够检查数字和抛出地图中的数字格式错误

你可以使用投掷、试抛、试抓和防守(如果有的话)。这是密码

    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数组时,我们正在扩展map closure函数参数,以包括数字格式检查和使用“guard”抛出错误

如果不可用,“防护装置”也可以替换为“如果”

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

您可以创建自己的符合
ErrorType
的Swift本机
enum
,而不是抛出
NSError
类型,其中枚举包含要显式处理的错误案例。例如

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
}
do try catch
构造中的用法示例:

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. */