关于返回可选类型的异常抛出函数

  大家知道,在可选链(optional chain)里,返回可选类型的可选链返回的仍是可选类型。但是要注意的是,在异常处理里,对于返回类型是可选类型(optional)的异常抛出函数,其返回类型是可选的可选类型。

  非常绕口是不是,对啦~就是这样~2333333333。简单来说,对于下面这个异常抛出函数

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 ..< 1:

        throw numTest._0

    case ..< 2:

        throw numTest._1

    case ..< 3:

        throw numTest._2

    case ..< 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

测试结束

 

-----------

 

posted @ 2017-04-02 22:55  懒虫哥哥  阅读(124)  评论(0编辑  收藏  举报