gpt4 book ai didi

ios - NSPredicate 乱序/额外信息

转载 作者:行者123 更新时间:2023-11-30 10:53:54 24 4
gpt4 key购买 nike

假设我有两个对象:

  • 大型自行车(尺寸=大,类型=自行车)
  • 小型自行车(尺寸=小型,类型=自行车)

如果我进行以下查询:“Big Blue Bike”,我应该收到返回的 Big Bike 对象。

我正在尝试弄清楚如何从 NSPredicate 函数中实现此功能。

目前,我正在使用以下内容:

let typePredicate = NSPredicate(format: "type CONTAINS[c] %@", text);

但是,由于“Blue”不在对象中,因此谓词将从过滤数组中消除所有对象。

是否有一种 NSPredicate 格式可以让我考虑这些无关的语句,并且仍然从“Big Blue Bike”返回 Big Bike?

最佳答案

我只是举了一个简单的例子,如何实现这一点,这只是一个例子,只是为了提供一些想法,以便您可以进一步进行,假设我们稍后将创建一个名为 Vehicle 的类将创建另外 2 个类,正如您刚才提到的,BigBikeSmallBike,之后将了解如何使用您的查询字符串来解析它

让我们创建一个名为 Vehicle 的类,该类保存所有信息,如果数组中有单一类型对象,这将很有用。

 import Foundation

enum Size {
case big
case small
}

enum Type {
case Bike
case Car
}

class Vehicle:NSObject {
let size:Size
let type:Type

init(with vehicleType:Type, andSize vehicleSize:Size) {
self.size = vehicleSize
self.type = vehicleType
}

override func value(forKey key: String) -> Any? {
if key == "size" {
if self.size == .big {
return "big"
} else if self.size == .small {
return "small"
}
} else if key == "type" {
if self.type == .Bike {
return "bike"
} else if self.type == .Car {
return "car"
}
}
return nil
}

func vehicleDescription() {
let aType = (type == .Bike) ? "Bike" : "Car"
let aSize = (size == .big) ? "Big" : "Small"
print("this vehicle is \(aType) of size \(aSize)")
}
}

现在我们将创建您在问题 BigBikeSmallBike 中提到的两个对象,如下所示,只是 Vehicle 类的子类

import Foundation
class BigBike:Vehicle {

}

还有一个SmallBike

import Foundation
class SmallBike:Vehicle {

}

现在您有 2 个类 BigBikeSmallBike 现在让我们过滤从这两个类创建的这些对象,您的数组包含这两个类的对象,例如,让我们采用一个数组并附加 BigBikeSmallBike 的对象,如下所示,

var vehicles:NSMutableArray =  NSMutableArray()
//add some objects for above array like below for testing:
func setupVehicleArray() {
for i in 0..<15 {
if i < 5 {
let vehicle = BigBike(with: .Bike, andSize: .big)
vehicles.add(vehicle)//append(vehicle)
}
if i > 5 && i < 10 {
let vehicle = BigBike(with: .Bike, andSize: .small)
vehicles.add(vehicle)
}
if i > 11 && i < 15 {
let vehicle = BigBike(with: .Bike, andSize: .big)
vehicles.add(vehicle)
}
}
}

现在vehicles包含BigBikeSmallBike的对象,现在让我们使用谓词进行查询和过滤这些对象

 func makeQuery() {
let query = "big blue bike"
let aPredicate = NSPredicate { (obj:Any?, test:[String : Any]?) -> Bool in
var checkFurther = false
if let aObj = obj as? Vehicle {
if let size = aObj.value(forKey: "size") as? String {
if query.contains(size) {
checkFurther = true
}
}
if let type = aObj.value(forKey: "type") as? String {
if query.contains(type) {
if checkFurther {
return true
}
}
}
}
return false
}

let filteredArray = vehicles.filtered(using: aPredicate)
for aVehicle:Vehicle in filteredArray as! [Vehicle] {
aVehicle.vehicleDescription()
}
}

这只是您可以尝试的示例,还为其他查询提供了值,您可以根据您的要求修改谓词。

上面给出的结果如下:

这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车的尺寸为 Big 自行车
这辆车是大号自行车

如果将查询字符串更改为small green bike,您将得到如下结果这辆车是小型自行车
这辆车的尺寸为小型自行车
这辆车的尺寸为小型自行车
这辆车是小型自行车

希望这有帮助..:)

关于ios - NSPredicate 乱序/额外信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54166965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com