如何在Swift中使用或条件进行可选操作?

2nc8po8w  于 2022-12-26  发布在  Swift
关注(0)|答案(2)|浏览(122)

我正在努力做到以下几点:

var isSomeThingTrue = checkSomeThing()

if (let someOptional = getSomeOptional(),
   let anotherOptional = getAnotherOptional(withSomeOptional: someOptional)) ||
   isSomeThingTrue {
   // do something
} else {
   // do something else
}

是否有一种方法可以通过if语句实现,或者我必须使用guard语句

lbsnaicq

lbsnaicq1#

if let x = y语法的要点在于,if块仅在y不为nil时运行,因此可以将其绑定到一个非可选的let常量x,并且x可以在if块中使用。
然而,在您的例子中,即使getSomeOptional()返回nil,if块仍然可以运行,但是isSomeThingTrue为true,所以在if块中,您不知道getSomeOpional是否返回nil,someOptional仍然必须是可选类型,anotherOptional也是如此。
因此,您不需要使用if let来执行此操作,只需执行以下操作即可:

// unlike with the 'if let', these let constants are visible are in scope outside the if statement too
// if you don't like that for some reason, wrap the whole thing with a do { ... } block
let someOptional = getSomeOptional()
let anotherOptional = getAnotherOptional(withSomeOptional: someOptional)
if (someOptional != nil && anotherOptional != nil) || isSomeThingTrue {
   // do something
} else {
   // do something else
}

如果getAnotherOptional采用非可选,则使用flatMap

let anotherOptional = someOptional.flatMap(getAnotherOptional(withSomeOptional:))
f0brbegy

f0brbegy2#

我想有很多方法可以剥这只猫的皮,所以这里还有一个,如果你把要在if内部执行的代码移到一个函数中以避免代码重复,下面的方法在我的选项中很容易阅读

if let someOptional = getSomeOptional(), let anotherOptional = getAnotherOptional(withSomeOptional: someOptional) {
    doSomething(anotherOptional)
} else if checkSomeThing() {
    doSomething(nil)
} else {
   // do something else
}

相关问题