我有一个音频播放器的全局变量。 在变量初始化之前放置try word之间的区别是什么
do{
try audioPlayer = AVAudioPlayer(contentsOf: audioURL)
}catch {}
在调用构造函数之前放置try
do{
audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
}catch {}
当然,上述两个案例都没有任何编译错误。 感谢
答案 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
,try
或try?
的运算符适用于。{ 整个二进制表达式。也就是说,您可以使用括号 明确了运营商的申请范围。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 {}
适用于两个表达式try
和audioPlayer
。单独的表达式AVAudioPlayer(contentsOf: audioURL)
不可能在此处抛出错误 - 因此在这种情况下audioPlayer
仅适用于对try
AVAudioPlayer
的调用,可以扔。
这个推导of the grammar是:
init(contentsOf:)
当你说
时// "try" "audioPlayer" "= AVAudioPlayer(contentsOf: audioURL)"
expression → try-operatoropt prefix-expression binary-expressionsopt
prefix-expression → prefix-operatoropt postfix-expression
postfix-expression → primary-expression
primary-expression → identifier generic-argument-clauseopt
identifier → // matches "audioPlayer" (I'm not going to fully derive this bit further)
binary-expressions → binary-expression binary-expressionsopt
binary-expression → assignment-operator try-operatoropt prefix-expression
prefix-expression → prefix-operatoropt 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-operatoropt 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
展示位置 < - >它会修改可以抛出的方法调用。它有时可能适用于整个作业,但并非总是如此,而且这是一个不好的习惯。