Swift guard语句允许您将选项解包为新常量,并在赋值失败时提前返回。
var someString:String? = "hello"
...
...
guard let newString = someString
else {
return
}
...
如果我想打开一个可选项并将其设置为预定义的非可选变量,我首先解包到新常量(newString)然后在guard语句之后设置非可选变量像这样:
var someString:String? = "hello"
var nonOptionalString:String = "bonjour"
...
...
guard let newString = someString
else {
return
}
nonOptionalString = newString
...
有没有办法在guard语句的条件下设置一个预定义的非可选var而不创建一个新常量?如下所示(它不起作用) )?
var someString:String? = "hello"
var nonOptionalString:String = "bonjour"
...
...
guard nonOptionalString = someString
else {
return
}
...
如果这样的事情是不可能的,那么Swift语言设计或技术原因背后是否存在一个潜在的哲学,为什么它不存在?
答案 0 :(得分:1)
我有两种方法可以做到这一点。
guard let someString = someString else { return }
这只是检查值,使用相同的变量名。
guard someString != nil else { return }
做第二个,你甚至可以用一声巨响来宣告它(!)它会以某种方式“预先定义”为“非选择性”。
所以现在你可以声明它:
var someString:String! = "hello"
我认为你正在寻找这个。
编辑:现在你可以使用自己的例子了。
guard someString != nil, nonOptional == someString else { return }
答案 1 :(得分:1)
我只会测试time * 10-03
,然后在我知道不是时解压缩:
nil
或者如果var someString: String? = "hello"
let nonOptionalString: String // note, you don't have to initialize this with some bogus value
guard someString != nil else { return }
nonOptionalString = someString!
是某个方法或闭包的参数,您可以使用相同的变量名称展开someString
语句,从而简化生活:
guard
如果你急于在单个语句中解包并退出if-func foo(someString: String?) {
guard let someString = someString else { return }
// now I can just use local `someString`, which is not optional anymore
}
,理论上你可以编写一个函数来解包,如果它可以或抛出错误,如果它不能:
nil
然后你可以这样做:
extension Optional {
enum OptionalError: Error {
case unwrapFailed
}
func unwrap<T>() throws -> T {
if self == nil { throw OptionalError.unwrapFailed }
return self as! T
}
}
我认为这太可怕了,但是如果你不顾一切地将它提炼到一行,那就是一种方法。
答案 2 :(得分:0)
如果要点仅在可以进行分配时进行分配,请写:
nonOptionalString = someString ?? nonOptionalString
如果真的 还需要return
,如果无法进行分配,那么只需编写一个if / else子句:
if someString != nil {
nonOptionalString = someString!
} else {
return
}
换句话说,不要试图这么花哨,只是说出你的意思。