【问题标题】:Removing NSNull from Key Path Results with Partial Matches从部分匹配的关键路径结果中删除 NSNull
【发布时间】:2016-02-08 21:32:35
【问题描述】:

给定一个对象不匹配的数据结构:

 1> import Foundation
 2> let d: NSDictionary = ["test": [["name": "Dick", "age": 101], ["name": "Jane"]]]

valueForKeyPath: 将返回子对象总数的值:

 3> d.valueForKeyPath("test.name") as! NSArray
 $R2: NSArray = "2 values" {
   [0] = "Dick"
   [1] = "Jane"
 }

即使叶键在所有情况下都不存在:

4> d.valueForKeyPath("test.age") as! NSArray 
$R3: NSArray = "2 values" {
  [0] = Int64(101)
  [1] = {
    NSObject = {
     isa = NSNull
    }
  }
}

有没有办法只获取现有的ages,而没有NSNull 的实例?

如果有多个没有叶子键的子对象,@distinctUnionOfArrays 等会有所帮助,但您仍然只剩下一个 NSNull

顺便说一句,如果叶键完全未知,则只返回 NSNulls:

5> d.valueForKeyPath("test.dog") as! NSArray
$R4: NSArray = "2 values" {
  [0] = {
    NSObject = {
      isa = NSNull
    }
  }
  [1] = {
    NSObject = {
      isa = NSNull
    }
  }
}

相反,如果根密钥未知,则返回nil

6> d.valueForKeyPath("dog.name")
$R5: AnyObject? = nil

这个逻辑让我觉得前后矛盾,但也许我遗漏了什么?

【问题讨论】:

    标签: ios nsobject foundation key-value-coding


    【解决方案1】:

    var 数组:[AnyObject] = [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, NSNull(),1.7, 1.8, 1.9]

    让 newArr = array.filter{ !($0 是 NSNull) }

    newArr

    【讨论】:

    • 我知道如何用普通代码做到这一点。我专门询问关键路径逻辑。
    • 你可以用你的函数 valueForKeyPath 逻辑扩展 NSObject 吗?
    【解决方案2】:

    你问题的第二部分对我来说没有意义:

    这段代码:

    let x = d.valueForKeyPath("dog.name")
    

    使 x 成为可选的AnyObject?

    它返回 nil 并在您的数据上使用键“dog.name”。这与具有 nil/NSNULL 条目的数组不同。

    如果你尝试强制解包,它会崩溃:

    let x = d.valueForKeyPath("dog.name") as! NSArray
    

    如果您想摆脱 NSNull 条目,请使用过滤器:

    let y = (d.valueForKeyPath("test.age") as? NSArray)?.filter{!($0 is NSNull)}
    

    在上面的代码中,我使用as?valueForKeyPath 的结果转换为一个数组,这样如果调用没有返回任何结果,它就可以返回nil。 (否则它会崩溃。)

    然后我只在结果不为零时才调用过滤器。

    最后,我将数组过滤为仅那些不是 NSNull 的对象。

    请注意,y 是可选的,如果 d.valueForKeyPath("test.age") 没有返回结果,则为 nil。

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多