如果不让 - 在斯威夫特

Pet*_*haw 45 macos xcode swift

有没有办法在迅速否定"如果让"?这看起来很愚蠢:

    if let type = json.type  {

    } else {
        XCTFail("There is no type in the root element")
    }
Run Code Online (Sandbox Code Playgroud)

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

enum JSONDataTypes {
    case Object
    case Array
    case Number
    case String
}
Run Code Online (Sandbox Code Playgroud)

非常感谢

编辑:这是一个:

var type: JSONDataTypes? = nil
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 40

Swift 2.0(Xcode 7)和更高版本都有新的guard语句,类似于"if not let" - 你可以有条件地将一个变量绑定到封闭范围的其余部分,保持代码中的"良好路径"至少缩进.

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

对此的要求是必须退出该范围的else子句guard(因为否则您将在该子句之后进入代码,其中受保护的变量(type如上所述)是未绑定的).所以它的东西就这样结束return,break,continue或者是编译器知道的一个函数永不返回(即注解@noreturn,就像abort()......我不记得不加思索如果包括XCTFail,但它应该(提交错误,如果它是不).

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


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

XCTAssert(json.type != nil, "There is no type in the root element")
Run Code Online (Sandbox Code Playgroud)

  • `guard let else {}`不等于`if not let {}`,因为在`guard`的范围内必须始终调用`return`或`break`.他们不能被允许通过:''守卫'身体可能不会通过,考虑使用'返回'或'休息'退出范围 (10认同)

Abh*_*ert 24

这是你如何做到的:

if json.type == nil {
  // fail
}
Run Code Online (Sandbox Code Playgroud)

  • @ChoppinBroccoli最初的问题暗示Peter Shaw并不关心实际的类型.如果`json.type`为零,他正在编写一个测试用例,并且他想要更简洁地完成它. (3认同)