在保护条件下将选项解包到预定义变量而不创建新常量

时间:2017-05-16 22:13:39

标签: swift optional unwrap

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语言设计或技术原因背后是否存在一个潜在的哲学,为什么它不存在?

3 个答案:

答案 0 :(得分:1)

我有两种方法可以做到这一点。

  1. guard let someString = someString else { return }
  2. 这只是检查值,使用相同的变量名。

    1. guard someString != nil else { return }
    2. 做第二个,你甚至可以用一声巨响来宣告它(!)它会以某种方式“预先定义”为“非选择性”。

      所以现在你可以声明它:

      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
}

换句话说,不要试图这么花哨,只是说出你的意思。