"尝试"的位置差异关键字

时间:2017-03-09 11:15:53

标签: swift try-catch

我有一个音频播放器的全局变量。 在变量初始化之前放置try word之间的区别是什么

do{
   try audioPlayer = AVAudioPlayer(contentsOf: audioURL)
}catch {}

在调用构造函数之前放置try

do{
   audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
}catch {}

当然,上述两个案例都没有任何编译错误。 感谢

2 个答案:

答案 0 :(得分:5)

没有实际差异。正如said by the language guide(强调我的):

  

当二元运算符左侧的表达式为   标有Scenario: Removal of something with confirmation dialog Given I accept confirmation dialogs And I click a ".mylink" element And I wait for AJAX to finish And I should not see a ".some-removed-element" element trytry?的运算符适用于。{   整个二进制表达式。也就是说,您可以使用括号   明确了运营商的申请范围。

try!

就像// try applies to both function calls sum = try someThrowingFunction() + anotherThrowingFunction() // try applies to both function calls sum = try (someThrowingFunction() + anotherThrowingFunction()) // Error: try applies only to the first function call sum = (try someThrowingFunction()) + anotherThrowingFunction() 一样,赋值也是一个二元运算符。因此,当你说

+

do{ try audioPlayer = AVAudioPlayer(contentsOf: audioURL) }catch {} 适用于两个表达式tryaudioPlayer。单独的表达式AVAudioPlayer(contentsOf: audioURL) 不可能在此处抛出错误 - 因此在这种情况下audioPlayer仅适用于对try AVAudioPlayer的调用,可以扔。

这个推导of the grammar是:

init(contentsOf:)

当你说

//           "try"          "audioPlayer"     "= AVAudioPlayer(contentsOf: audioURL)"
expression → try-operator­opt ­prefix-expression ­binary-expressions­opt

prefix-expression → prefix-operator­opt ­postfix-expression
postfix-expression → primary-expression­
primary-expression → identifier­ generic-argument-clause­opt
identifier­ → // matches "audioPlayer" (I'm not going to fully derive this bit further)

binary-expressions → binary-expression ­binary-expressions­opt
binary-expression → assignment-operator ­try-operator­opt­ prefix-expression
prefix-expression → prefix-operator­opt postfix-expression
postfix-expression → initializer-expression­ // matches AVAudioPlayer(contentsOf: audioURL)

您正在使用分配表达式has the grammar of

这一事实
do{
   audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
}catch {}

正如您所看到的,binary-expression → assignment-operator ­try-operator­opt ­prefix-expression­ 也会出现在运营商的右侧,因此将适用于try-operator - 在这种情况下是prefix-expression

因此,在这两种情况下,您都会捕获AVAudioPlayer.init(contentsOf:)可能引发的错误。第一个例子只包括从操作符左侧的表达式抛出错误的可能性,它不可能

使用您感觉更舒服的方式 - 我的个人偏好以及与AVAudioPlayer.init(contentsOf:)在该语言的其他位置放置更一致的选项是将try放在右侧 - 手边。

答案 1 :(得分:2)

在我看来,这个编译是一个错误的事实:

try audioPlayer = AVAudioPlayer(contentsOf: audioURL)

基本上,你正在做一些你不应该做的事情,而你很幸运它在这里滑过了编译器。作为一个反例,考虑如果audioPlayer在这里宣布会发生什么:

try let audioPlayer = AVAudioPlayer(contentsOf: audioURL) // error

没有编译,Fix-It正确地将try移动到它所属的位置:

let audioPlayer = try AVAudioPlayer(contentsOf: audioURL)

因此,我建议遵循的规则是您应该正确使用try展示位置 < - >它会修改可以抛出的方法调用。它有时可能适用于整个作业,但并非总是如此,而且这是一个不好的习惯。