关于返回可选类型的异常抛出函数
大家知道,在可选链(optional chain)里,返回可选类型的可选链返回的仍是可选类型。但是要注意的是,在异常处理里,对于返回类型是可选类型(optional)的异常抛出函数,其返回类型是可选的可选类型。
func errorTest(by doubleNum: Double) throws -> String?
使用try?是返回的类型是String??
还是看例子。下面这个异常类型和之前一样,异常抛出函数则是之前函数的重载
enum numTest: Int, Error {
case _0, _1, _2, _3
case nothing = 999
}
func errorTest(by doubleNum: Double) throws -> String? {
switch doubleNum {
case 0 ..< 1:
throw numTest._0
case 1 ..< 2:
throw numTest._1
case 2 ..< 3:
throw numTest._2
case 3 ..< 4:
throw numTest._3
case 10 ..< 11:
throw numTest.nothing
default:
if doubleNum > 10000.0 {
return nil
}else {
return "\(doubleNum)"
}
}
}
for d in [2.6, 8.4, 12345.54321] {
print("即将开始测试")
if let x = try? errorTest(by: d) {
print("测试中", terminator: " ")
print("正常, 测试值 = \(d); 结果 = \(x)")
}else {
print("测试中, 异常")
}
print("测试结束")
print("-----------")
}
运行结果如下:
即将开始测试
测试中, 异常
测试结束
-----------
即将开始测试
测试中 正常, 测试值 = 8.4; 结果 = Optional("8.4")
测试结束
-----------
即将开始测试
测试中 正常, 测试值 = 12345.54321; 结果 = nil
测试结束
-----------
换一个更直观的测试:
for d in [2.6, 8.4, 12345.54321] {
print("即将开始测试")
switch try? errorTest(by: d) {
case let result??:
print("测试中", terminator: " ")
print("正常, 测试值 = \(d); 结果 = \(result)")
case nil?:
print("测试中", terminator: " ")
print("正常, 测试值 = \(d); 结果 = nil")
case nil:
print("测试中, 异常, 测试值 = \(d)")
}
print("测试结束")
print("-----------")
}
运行结果如下:
即将开始测试
测试中, 异常, 测试值 = 2.6
测试结束
-----------
即将开始测试
测试中 正常, 测试值 = 8.4; 结果 = 8.4
测试结束
-----------
即将开始测试
测试中 正常, 测试值 = 12345.54321; 结果 = nil
测试结束
-----------