如果不让 - 在斯威夫特

时间:2014-12-10 23:24:15

标签: xcode macos swift

有没有办法在迅捷中否定“if let”? 这看起来很愚蠢:

    if let type = json.type  {

    } else {
        XCTFail("There is no type in the root element")
    }

我不能使用XCTAssertNotNil,因为json.type是一个枚举。

enum JSONDataTypes {
    case Object
    case Array
    case Number
    case String
}

非常感谢

编辑:它是:

var type: JSONDataTypes? = nil

3 个答案:

答案 0 :(得分:37)

Swift 2.0(Xcode 7)及更高版本有新的guard语句,这类似于"如果没有让#34; - 你可以在一个封闭范围的其余部分有条件地绑定一个变量,保持"良好的路径"在你的代码中最少缩进。

guard let type = json.type else {
    XCTFail("There is no type in the root element")
}
// do something with `type` here

这样做的一个问题是else的{​​{1}}子句必须退出该范围(因为否则你会落入该子句之后的代码中,其中保护变量,如{{ 1}}以上,未绑定)。所以它必须以guardtypereturn或编译器已知的永不返回的函数结束(即注释break,如{{1}如果其中包含continue,我不会立即回想起它,但它应该(file a bug if it's not)。

有关详细信息,请参阅 Swift编程语言中的Early Exit


至于真实的东西......在Swift 1.x中没有否定的if-let形式。但是,既然您正在使用XCTest,那么您可以只测试断言表达式的可选部分:

@noreturn

答案 1 :(得分:23)

这是你如何做到的:

if json.type == nil {
  // fail
}

答案 2 :(得分:2)

另一种选择我已经使用了几次:

switch json.type
{
    case .None: // ...
    case .Some(.Object): // ...
    case .Some(.Array):  // ...
    case .Some(.Number): // ...
    case .Some(.String): // ...
}

由于?实际上是Optional<T>,它本身就是一个枚举,定义为:

enum Optional<T> : Reflectable, NilLiteralConvertible 
{
    case None
    case Some(T)

    ...
}