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