【问题标题】:Swift Optional Binding with a negative result带有否定结果的 Swift 可选绑定
【发布时间】:2020-01-17 05:43:33
【问题描述】:

如何在 Swift 中进行可选绑定并检查是否有否定结果?比如说我有一个可选的视图控制器,我想延迟加载。到了要用的时候,我想检查一下是不是nil,还没做完就初始化一下。

我可以这样做:

if let vc = viewController? {
   // do something with it
} else {
   // initialize it
   // do something with it
}

但这很笨拙且效率低下,并且需要我将“用它做点什么”代码放在那里两次或将其埋在闭包中。从 objC 经验中改进这一点的明显方法是这样的:

if !(let vc = viewController?) {
   // initialize it
}
if let vc = viewController? {
   // do something with it
}

但这会给您带来“模式变量绑定不能出现在表达式中”错误,这告诉我不要将绑定放在括号内并尝试将其作为表达式进行评估,这当然正是我的意思尝试做...

或者另一种写出实际有效的方法是:

if let vc = viewController? {

} else {
   // initialize it
}
if let vc = viewController? {
   // do something with it
}

但这是……愚蠢……因为没有更好的词。一定有更好的办法!

如何进行可选绑定并默认检查是否有否定结果?确定这是一个常见的用例吗?

【问题讨论】:

  • 你可能正在寻找 Swift 中关键而优秀的 "guard" 成语......stackoverflow.com/a/32004029/294884
  • 是的,Swift 2 添加了 guard,完美解决了这个问题。
  • 艾瑞克,呸,我们在7年后彻底解决了这个问题! :) :)

标签: swift


【解决方案1】:

您可以将Optional 隐式转换为布尔值

if !viewController {
    viewController = // something
}

let vc = viewController! // you know it must be non-nil 
vc.doSomething()

更新:在 Xcode6-beta5 中,Optional 不再符合 LogicValue/BooleanType,您必须使用 ==!=nil 进行检查

if viewController == nil {
    viewController = // something
}

【讨论】:

  • 没有“隐式转换为布尔值”之类的东西。 ! 适用于符合 LogicValue(现在为 BooleanType)的任何类型。 Optional 以前符合 LogicValue,但现在不再符合。
【解决方案2】:

这对你有用吗?

if viewController == nil {
  // initialize it
}

// do something with it

【讨论】:

  • 是的,这也行得通……我一直在车轴上寻找一种方法来使用可选件,而显而易见的是我正盯着我的脸!我想知道设计师的意图是什么?
【解决方案3】:

一种方法可能是创建一个处理操作的 defer 语句。我们可以通过检查 nil 来确保这些操作在我们的对象创建之后发生。如果我们遇到 nil,则实例化该对象并返回。在返回之前,我们的尊重将发生在某个函数的范围内。

func recreateAndUse() {

  defer {
    viewController?.view.addSubview(UIView())
    viewController!.beginAppearanceTransition(true, animated: true)
  }

  guard viewController != nil else {
    viewController = UIViewController()
    return
  }

}

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2014-07-30
    相关资源
    最近更新 更多