Swift可选绑定带有否定结果

时间:2014-08-04 05:57:23

标签: swift

如何在Swift中执行可选绑定并检查否定结果?比方说,我有一个可选的视图控制器,我想延迟加载。如果有时间使用它,我想检查它是否为零,如果尚未完成则将其初始化。

我可以这样做:

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
}

但是这会给你一个"模式变量绑定不能出现在表达式中#34;错误,这告诉我不要将绑定放在括号内并尝试将其作为表达式进行评估,这当然正是我试图做的......

或者另外一种写出来的方法是:

if let vc = viewController? {

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

但这是......愚蠢......缺乏更好的词汇。必须有更好的方法!

如何进行可选绑定并检查否定结果作为默认值?当然这是一个常见的用例?

3 个答案:

答案 0 :(得分:4)

你可以隐式地将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
}

答案 1 :(得分:2)

这对你有用吗?

if viewController == nil {
  // initialize it
}

// do something with it

答案 2 :(得分:0)

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

"SELECT * FROM table1 WHERE column2 in (" & String.Concat(",", list1.Select(Function(i) $"'{i}'").ToArray()) & ");"