在NSPredicate中使用NSNumber == nil过滤值

时间:2016-09-12 14:26:27

标签: ios objective-c nspredicate

我尝试使用类型为NSNumber的属性选择值,如果property == intValue或property == nil。 但是这段代码忽略了属性== nil的值。 重点是什么?

import UIKit
import AVFoundation

class ViewController: UIViewController {
    var engine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()

        let input = engine.inputNode!
        let player = AVAudioPlayerNode()
        engine.attach(player)

        let bus = 0
        let inputFormat = input.inputFormat(forBus: bus)
        engine.connect(player, to: engine.mainMixerNode, format: inputFormat)

        input.installTap(onBus: bus, bufferSize: 512, format: inputFormat) { (buffer, time) -> Void in
            player.scheduleBuffer(buffer)
        }

        try! engine.start()
        player.play()
    }
}

enter image description here

UPD:最简单的方法也不起作用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
        @"(ANY region.beacons.major == %d OR ANY region.beacons.major = nil) 
        AND (ANY region.beacons.minor == %d OR ANY region.beacons.minor = nil)",
        rangedBeacon.major.intValue, rangedBeacon.minor.intValue];

UPD 2:可能因为ANY + nil而出现问题 根据这个答案Core Data, NSPredicate, ANY key.path == nil ANY只选择NOTNULL值。

2 个答案:

答案 0 :(得分:0)

简单地测试未成年人的一个属性;例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                           @"region.beacons.minor.length = 0"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                           @"region.beacons.minor.stringValue = nil"];

编辑我认识到您应该删除ANY

如果minor为nil,则任何调用也将以nil返回,或者对于数字类型返回0。

答案 1 :(得分:-1)

首先,我注意到您在使用分配运算符=而不是相等 ==时与{{1}进行比较}。

另外,尝试与Singleton NSNull实例nil进行比较。