有没有办法在迅捷中否定“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
答案 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}}以上,未绑定)。所以它必须以guard
,type
,return
或编译器已知的永不返回的函数结束(即注释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)
...
}