如果不是让 – 在Swift中
有没有办法否定“如果让”在迅速? 这对我来说很愚蠢:
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
Swift 2.0(Xcode 7)和更高版本有一个新的guard
语句,就像“if not let”一样 – 你可以有条件地在封闭范围的其余部分绑定一个variables,在代码中保持“好path”最小的缩进。
guard let type = json.type else { XCTFail("There is no type in the root element") } // do something with `type` here
这个问题的关键在于guard
的else
子句必须退出这个范围(否则,在这个子句之后,就像上面的type
一样,被保护的variables不被绑定)。 所以它必须以return
, break
, continue
或编译器已知的函数永远不会返回(即注释@noreturn
,就像abort()
一样@noreturn
,如果包含XCTFail
,它应该( 如果不是,则提交一个bug )。
有关详细信息,请参阅Swift编程语言中的 提前退出 。
对于真正的老东西…在Swift 1.x中没有否定forms的if-let。 但是,既然你正在使用XCTest,你可以只testing一个断言expression式的可选部分:
XCTAssert(json.type != nil, "There is no type in the root element")
以下是你如何做到这一点:
if json.type == nil { // fail }
我已经使用了几次的另一种select:
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) ... }