xcode-如果不让-在Swi中

有没有一种方法可以迅速否定“如果让步”?这对我来说似乎很愚蠢:

    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
Peter Shaw asked 2020-08-01T15:06:49Z
3个解决方案
39 votes

Swift 2.0(Xcode 7)及更高版本具有新的else语句,该语句的工作方式类似于“ if let let” –您可以在封闭范围的其余部分中有条件地绑定变量,从而在代码中保留“良好路径” 缩进最少。

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

需要注意的是,guardelse子句必须退出该范围(因为否则您将陷入该子句之后的代码中,其中受保护的变量(如上面的2992329214763992092066)是未绑定的)。 因此,它必须以returnbreakcontinue之类的内容结尾,或者以编译器已知的永不返回的函数结尾(例如,注释为@noreturn之类的abort() ...如果包含XCTFail,但我应该记不得,但是应该( 提交错误(如果不是)。

有关详细信息,请参见The Swift Programming Language中的Early Exit。


至于真正古老的东西……在Swift 1.x中没有否定形式的if-let。 但是由于无论如何您都在使用XCTest,因此只需测试断言表达式的可选部分即可:

XCTAssert(json.type != nil, "There is no type in the root element")
rickster answered 2020-08-01T15:07:19Z
24 votes

这是您的操作方式:

if json.type == nil {
  // fail
}
Abhi Beckert answered 2020-08-01T15:07:40Z
2 votes

我使用过几次的另一种选择:

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)

    ...
}
Can answered 2020-08-01T15:08:06Z
translate from https://stackoverflow.com:/questions/27412735/if-not-let-in-swift