Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从部分匹配的密钥路径结果中删除NSNull_Ios_Nsobject_Foundation_Key Value Coding - Fatal编程技术网

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吗?