【问题标题】:Comparing non-optional Any to nil is always false?将非可选的 Any 与 nil 进行比较总是错误的?
【发布时间】:2016-11-18 20:41:01
【问题描述】:

我正在遍历[String: Any] 的字典,寻找nils,所以我可以用NSNull 替换它们以进行JSON 写入。我的预编译器警告告诉我,将 Anynil 进行比较总是错误的,但我知道它至少包含两个从未找到的 nil。有没有办法检查Any 是否为零?

【问题讨论】:

标签: swift


【解决方案1】:

可选的可以是nil。其他任何东西都不能是nilAny 不是可选的。因此,将Anynil 进行比较是没有意义的。测试永远不会成功。

如果你知道这些东西可能是可选的,你应该把它输入为Any?。这是一个可选的,可以与nil 进行比较。这是一个简单的例子:

    let s : String? = nil
    let any : Any? = s
    if any == nil {
        print("nil") // nil
    }

如您所见,测试成功。

(不过,如果可能的话,最好能更精确地输入内容。)

【讨论】:

  • 也许我的展开已关闭,但尝试这样做并没有给我任何帮助 - ``` for (_, attr) in mirror.children.enumerated() { if let propName = attr.label , let jsonKey = keys[propName] { if let nilable = attr.value as Any? { if nilable == nil { print("从未调用") } } } } ```
  • 好吧,如果你想了解代码的细节,你需要问另一个问题,在其中你展示了代码和理解它所需的一切(即所有东西的声明类型)。我只回答了您实际询问的问题,即为什么您会收到此警告和运行时结果,以及与nil 成功比较需要什么。
【解决方案2】:

if(object_getClass(yourVariable)?.description() == "NSNull") 可以是一种检查方式。

【讨论】:

  • 谢谢。它解决了我的问题。可选类型和泛型存在一些错误和问题。你可以看我的代码:gist.github.com/fthdgn/…
【解决方案3】:

我已经用下面的表达式解决了这个问题:

let filteredResult = dictionary.filter { !(($0.value as AnyObject) is NSNull) }

【讨论】:

    【解决方案4】:

    Swift 中的 Objective-c 属性。 如果您在 swift 中使用了一些目标 c 属性,并且它说类似 “将 'XYZ' 类型的非可选值与 'nil' 进行比较总是返回 true” 您必须创建该目标 c 属性到 "_Nullable" 以便该属性可能不再是可选的。像 @property (strong,nonatomic) NSString *_Nullable someString;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-03-19
      • 2022-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多