- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个对象:
如果我进行以下查询:“Big Blue Bike”,我应该收到返回的 Big Bike 对象。
我正在尝试弄清楚如何从 NSPredicate
函数中实现此功能。
目前,我正在使用以下内容:
let typePredicate = NSPredicate(format: "type CONTAINS[c] %@", text);
但是,由于“Blue”不在对象中,因此谓词将从过滤数组中消除所有对象。
是否有一种 NSPredicate
格式可以让我考虑这些无关的语句,并且仍然从“Big Blue Bike”返回 Big Bike?
最佳答案
我只是举了一个简单的例子,如何实现这一点,这只是一个例子,只是为了提供一些想法,以便您可以进一步进行,假设我们稍后将创建一个名为 Vehicle
的类将创建另外 2 个类,正如您刚才提到的,BigBike
和 SmallBike
,之后将了解如何使用您的查询字符串来解析它
让我们创建一个名为 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)")
}
}
现在我们将创建您在问题 BigBike
和 SmallBike
中提到的两个对象,如下所示,只是 Vehicle
类的子类
import Foundation
class BigBike:Vehicle {
}
还有一个SmallBike
import Foundation
class SmallBike:Vehicle {
}
现在您有 2 个类 BigBike
和 SmallBike
现在让我们过滤从这两个类创建的这些对象,您的数组包含这两个类的对象,例如,让我们采用一个数组并附加 BigBike
和 SmallBike
的对象,如下所示,
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
包含BigBike
和SmallBike
的对象,现在让我们使用谓词进行查询和过滤这些对象
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/
序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了
我尝试根据给定的级别顺序(BFS 顺序)构造 BST。我知道这是可能的,但我不知道我该怎么写。问题是我必须使用 BFS 序列。所以,我不能在这里使用递归,我必须迭代地编写我的程序......我发现这有
我是一名优秀的程序员,十分优秀!