【问题标题】:Why can’t I use guard when setting AVAudioSession category?为什么设置 AVAudioSession 类别时不能使用guard?
【发布时间】:2016-02-08 01:15:13
【问题描述】:

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

为什么下面的代码会报错“Ambiguous reference to member setCategory”:

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

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

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

如果这个调用没有失败,我不打算采取任何行动,但我仍然不想使用try!——那么我可以guard这个声明吗?或者,我误解了guard?

【问题讨论】:

    标签: swift swift2 guard


    【解决方案1】:

    来自Control Flow 文档:

    提前退出
    guard 语句,如 if 语句,执行语句取决于 关于表达式的布尔值。您使用guard 语句来 要求条件必须为真,以便后面的代码 要执行的保护语句。

    一个典型的例子是

    guard <someCondition> else { return }
    

    如果不满足条件,则从函数“提前返回”。

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

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

    所以这是完全不同的事情。 guard 声明 不能与 throwing 函数一起使用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2018-09-09
      • 2020-08-19
      • 1970-01-01
      • 2011-09-06
      • 2014-04-10
      相关资源
      最近更新 更多