我可以使用`try?`和泛型方法吗?

时间:2017-04-14 17:47:08

标签: swift generics try-catch

我有一个通用的投掷方法:

func doSomething<T>() throws -> T? {
    // do something
}

这就是我想要的方式:

let obj: SomeClass? = try? doSomething()    // a compiler error!

但我可能不会。编译器给我一个错误

  

未展开的可选类型'SomeClass??'的值;您是指使用'try!'还是使用'?'链接?。

我可以使用try!try代替。但我不喜欢前者,因为它可能会在某些时候崩溃应用程序,我不喜欢后者,因为它对于大多数情况来说太长了(一行变为五行)。

有人知道我如何继续使用try?

1 个答案:

答案 0 :(得分:1)

您的方法返回一个可选项。 try?表达式添加了另一个可选级别,因此您的预期返回值应该是双重可选:

let obj: SomeClass?? = try? doSomething()

将可选项和throws的返回结合起来可能不是一个好主意。

您还可以使用??删除第二级选项:

let obj: SomeClass? = (try? doSomething()) ?? nil

但我真的建议重新设计API而不是解决双重选项。