Xcode 如果不让,请迅速进入
有没有办法否定swift中的“如果让”呢? 这在我看来很愚蠢:Xcode 如果不让,请迅速进入,xcode,macos,swift,Xcode,Macos,Swift,有没有办法否定swift中的“如果让”呢? 这在我看来很愚蠢: if let type = json.type { } else { XCTFail("There is no type in the root element") } 我不能使用xctasertnotnil,因为json.type是一个枚举 enum JSONDataTypes { case Object case Array case Number c
if let type = json.type {
} else {
XCTFail("There is no type in the root element")
}
我不能使用xctasertnotnil,因为json.type是一个枚举
enum JSONDataTypes {
case Object
case Array
case Number
case String
}
非常感谢
编辑:它是一个:
var type: JSONDataTypes? = nil
以下是您的操作方法:
if json.type == nil {
// fail
}
Swift 2.0(Xcode 7)和更高版本有了新的guard
语句,其工作原理类似于“if not let”--您可以有条件地在封闭范围的其余部分绑定变量,使代码中的“good path”缩进最少
guard let type = json.type else {
XCTFail("There is no type in the root element")
}
// do something with `type` here
这个问题的关键是guard
的else
子句必须退出该范围(因为否则您将陷入该子句之后的代码中,其中受保护的变量(如上面的type
)是未绑定的)。因此,它必须以类似返回
、中断
、继续
或编译器已知永远不会返回的函数结束(即注释的@noreturn
,如中止()
…我不会立即回忆起其中是否包含XCTFail
,但它应该()
有关详细信息,请参见Swift编程语言中的
至于真正古老的东西……Swift 1.x中没有否定形式的if let。但是,既然您正在使用XCTest,您可以将测试作为断言表达式的可选部分:
XCTAssert(json.type != nil, "There is no type in the root element")
我已经使用过几次的另一种选择:
switch json.type
{
case .None: // ...
case .Some(.Object): // ...
case .Some(.Array): // ...
case .Some(.Number): // ...
case .Some(.String): // ...
}
因为?
实际上是可选的
,它本身就是一个枚举,定义为:
enum Optional<T> : Reflectable, NilLiteralConvertible
{
case None
case Some(T)
...
}
enum可选:可反射、NilLiteralConvertible
{
无案例
案例(T)
...
}
是json.type
裸JSONDataTypes
,还是JSONDataTypes?
(可选)哦,对不起:var type:JSONDataTypes?=nil这确实是最让我沮丧的一件事,swift没有将json.type分配给type though当然,因为type
不是可选的,因此不能保留nil值。您的答案也没有将任何内容分配给type。这是不可能的。@chopinbrocci原始问题这意味着Peter Shaw不关心实际的类型。他正在编写一个测试用例,如果json.type
为nil,则该测试用例将失败,他希望能更简洁地执行该测试。@rob我不明白你怎么能声称他不关心“type”变量?他正在分配该变量,并且可能想在之后使用它。我认为这对于这个问题很重要因为用感叹号否定if-let似乎不起作用。他没有在if
语句的结果中添加任何内容(如..
或//code here
)。此外,他还想“否定”if-let’。这些加在一起意味着他不在乎价值。非常感谢你的解释。对我帮助很大。Swift 2中没有“如果不让”,但新的guard
语句正是你想要的。更新的答案。guard let else{}
不是如果不让{}<代码> >因为在<代码>范围内,Gue/<代码>必须始终调用<代码>返回<代码>或<代码>破解< /代码>。它们不能允许通过:<代码>“守护”体可能不会通过,请考虑使用“返回”或“中断”来退出范围< /代码>。