我有一个字符串
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
我需要能够检查数字并在地图中抛出数字格式错误。
答案 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. */