为什么我在设置AVAudioSession类别时不能使用guard?

时间:2015-11-06 19:42:00

标签: swift swift2 guard

这是一个简单的Swift 2.0问题,希望有一个简单的答案:

为什么以下代码会给出错误“对成员setCategory的模糊引用”:

guard AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) else {
    //
}

然而,这段代码并没有抛出这个错误:

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
} catch {
     //
}

如果此次通话没有失败,我不打算采取任何行动,但我仍然不想使用try! - 我可以guard这句话吗?或者,我误解了guard

1 个答案:

答案 0 :(得分:2)

来自Control Flow文档:

  

提前退出
  guard语句与if语句一样,执行语句   在表达式的布尔值上。您使用guard语句   要求条件必须为true才能使代码在。之后   保护声明将被执行。

典型的例子是

guard <someCondition> else { return }
如果不满足条件,

从函数“提前返回”。

但抛出函数不是布尔表达式, 他们必须在某些“尝试上下文”中被调用,如中所述 Error Handling

  

处理错误
  当函数抛出错误时,它会改变程序的流程,   因此,您可以快速识别代码中的位置   这可能会引发错误。要在代码中标识这些位置,请写入   在一段代码之前的try关键字或try?try!变体   调用可能引发错误的函数,方法或初始化程序。

所以这是完全不同的事情。 guard语句 不能与投掷功能一起使用。

如果您不关心投掷功能的成功或失败, 使用try?并忽略结果,如 An elegant way to ignore any errors thrown by a method。在你的情况下:

_ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)