如何在map中抛出错误,将字符串转换为int数组以获取数字格式异常

时间:2016-05-26 18:03:56

标签: 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

我需要能够检查数字并在地图中抛出数字格式错误。

2 个答案:

答案 0 :(得分:2)

你可以使用throws,try - throw,do - try - catch和guard(if)。这是代码

IDispatcher

在getIntArray函数中,我们首先将输入字符串转换为字符串数组。 然后当我们将字符串数组转换为int数组时,我们正在扩展map closure函数参数以包含数字格式检查和使用“guard”引发错误。

“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
    }

答案 1 :(得分:2)

您可以创建自己的符合NSError的Swift本地enum,而不是抛出ErrorType类型,其中您的枚举包含您要显式处理的错误情况。 E.g。

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