2016-03-03 40 views
9

在迅速,是否有可能使用较短的guard let try?如果进入else块,会得到发生异常?是否可以使用“try?”检索guard-statement中的异常?

guard let smth = try? myThrowingFunc() else { 
    print(error) //can I access the exception here somehow? 
    return 
} 

VS

let smth: AnyObject? 
do { 
    smth = try myThrowingFunc() 
} catch let error { 
    print(error) 
    return 
} 
+1

我敢肯定,试试?就像?只需将smh转换为可选枚举,然后根据需要打开/验证它。这意味着,我认为它采取了do/catch范例 –

+0

是的,'guard let smth = ...'尝试解开 - 如果失败,那么它将执行else块。所以这个构造可能是美好的,如果有可能以某种方式访问​​这个例外...... – smat88dd

+0

但是,谢谢,我可以理解它是如何工作的,并自己回答我的问题! – smat88dd

回答

5

我没有发现42页的 “雨燕编程语言(雨燕2.2预发布)”,其中就规定明确如下:

另一种方式来处理错误是使用try?将结果转换为可选项。如果函数抛出错误,将丢弃特定错误,结果为nil。否则,结果是包含函数返回值的可选项。

因此,这当然是苹果的功能要求。作为事实上还有已经在这个话题在这里的一些讨论:

http://thread.gmane.org/gmane.comp.lang.swift.evolution/8266

+0

我使用这种模式,如果让某些=经常尝试someOptional {}我经常不需要担心捕捉的东西。 –

+0

是的,它与守卫的事情相反。守卫对于早期退出功能非常有用。我已经注册了swift-evolution邮件列表,并且似乎对此功能感兴趣,因为已经有其他人有相同的想法:http://thread.gmane.org/gmane.comp.lang.swift.evolution/ 8266 – smat88dd

相关问题