Ios 从部分匹配的密钥路径结果中删除NSNull
给定对象不匹配的数据结构:Ios 从部分匹配的密钥路径结果中删除NSNull,ios,nsobject,foundation,key-value-coding,Ios,Nsobject,Foundation,Key Value Coding,给定对象不匹配的数据结构: 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> 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
}
}
}
是否有办法只获取现有的age
s,而不获取NSNull
的实例
@distinctunionofarray
等等,如果有多个子对象没有叶键,但仍然剩下一个子对象NSNull
另一方面,如果叶键完全未知,则只返回NSNull
s:
5> d.valueForKeyPath("test.dog") as! NSArray
$R4: NSArray = "2 values" {
[0] = {
NSObject = {
isa = NSNull
}
}
[1] = {
NSObject = {
isa = NSNull
}
}
}
6> d.valueForKeyPath("dog.name")
$R5: AnyObject? = nil
相反,如果根键未知,则返回nil
:
5> d.valueForKeyPath("test.dog") as! NSArray
$R4: NSArray = "2 values" {
[0] = {
NSObject = {
isa = NSNull
}
}
[1] = {
NSObject = {
isa = NSNull
}
}
}
6> d.valueForKeyPath("dog.name")
$R5: AnyObject? = nil
这个逻辑让我觉得不一致,但也许我遗漏了什么?var array:[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)}
纽瓦尔你问题的第二部分对我来说没有意义: 此代码:
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”)不返回结果,则y将为零。我知道如何在普通代码中执行此操作。我特别询问的是关键路径逻辑。您可以使用函数值ForkeyPath逻辑扩展NSObject吗?