【问题标题】:If not let - in SwiftIf not let - in Swift
【发布时间】:2015-02-09 08:09:16
【问题描述】:

有没有办法快速否定“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

【问题讨论】:

  • json.type 是纯JSONDataTypes,还是JSONDataTypes?(可选)?
  • 抱歉:var type: JSONDataTypes? = 无
  • 这确实是 Swift 最让我感到沮丧的地方

标签: xcode macos swift


【解决方案1】:

Swift 2.0 (Xcode 7) 和更高版本有新的guard 语句,有点像“如果不让”——你可以有条件地在封闭范围的其余部分绑定一个变量,保持“良好path" 在您的代码中缩进最少。

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

要注意的是guardelse 子句必须退出该范围(因为否则您将陷入该子句之后的代码中,其中受保护的变量,如上面的type,未绑定) .所以它必须以returnbreakcontinue 或编译器已知永远不会返回的函数结尾(即注释@noreturn,如abort()...我不记得了如果其中包括XCTFail,那么它应该是(file a bug if it's not)。

有关详细信息,请参阅Swift 编程语言中的Early Exit


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

XCTAssert(json.type != nil, "There is no type in the root element")

【讨论】:

  • 非常感谢您的解释。对我有很大帮助。
  • 在 Swift 2 中实际上没有“如果不让”,但新的 guard 语句几乎就是您要寻找的。更新了答案。
  • guard let else {} 不等同于if not let {},因为在guard 的范围内必须始终调用returnbreak。不能让他们掉下去:'guard' body may not fall through, consider using 'return' or 'break' to exit the scope
【解决方案2】:

你是这样做的:

if json.type == nil {
  // fail
}

【讨论】:

  • 虽然没有将 json.type 分配给类型
  • 当然,因为type 不是可选的,因此不能保存零值。您的答案也没有分配任何类型的内容。这是不可能的。
  • @ChoppinBroccoli 最初的问题暗示彼得肖不关心实际类型。他正在编写一个测试用例,如果 json.type 为 nil 则失败,并且他想更简洁地做到这一点。
  • @rob 我不明白你怎么能声称他不关心“类型”变量?他正在分配它,并且可能想在之后使用它。我认为这对这个问题很重要,因为用感叹号否定 if let 似乎不起作用。
  • 他没有在if 声明的结果中添加任何内容(如...// code here)。此外,他想“否定“如果让”。这些加在一起意味着他不在乎价值。
【解决方案3】:

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

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)

    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多