Xcode 如果不让,请迅速进入

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

有没有办法否定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
    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/<代码>必须始终调用<代码>返回<代码>或<代码>破解< /代码>。它们不能允许通过:<代码>“守护”体可能不会通过,请考虑使用“返回”或“中断”来退出范围< /代码>。