在 NSMutableArray 中搜索
Search in NSMutableArray
我想使用键值在 NSMUtableArray
上进行搜索以捕获孔对象,而不仅仅是一个值数组,例如我的 NSMUtableArray
return 我
{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}
{id : 4, name : y1}
{id : 5, name : y2}
如果我正在搜索 x 我的代码 return 我
{x1,x2,x3}
或者我想要 return
{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}
我的代码是:
let arrayy = lstResults.value(forKey: "name")
let searchTest = NSPredicate(format: "SELF BEGINSWITH [c] %@", searchBar.text!)
let array = (arrayy as! NSArray).filtered(using: searchTest)
filteredTableDataName = array as NSArray
请帮助我尝试了很多东西,但没有任何效果。
您可以直接过滤数组,而不是提取和过滤 "name"
值,使用相应的键路径而不是谓词中的“SELF”:
let array = NSArray(array: [
["id": 1, "name": "x1"], ["id": 2, "name": "x2"], ["id": 3, "name": "y3"]])
let predicate = NSPredicate(format: "name BEGINSWITH [c] %@", "x")
let filtered = array.filtered(using: predicate)
print(filtered)
结果:
[{
id = 1;
name = x1;
}, {
id = 2;
name = x2;
}]
另一种选择是将 NS(Mutable)Array
转换为 Swift 字典数组,并使用 filter()
函数:
if let a = array as? [[String: Any]] {
let filtered = a.filter {
([=12=]["name"] as? String)?
.range(of: "x", options: [.caseInsensitive, .anchored]) != nil
}
print(filtered)
// [["id": 1, "name": x1], ["name": x2, "id": 2]]
}
NSMutableArray
(或 NSArray
就此而言)是 'Objective-c' 时代的遗留物。
为此目的,没有真正需要使用它或不使用 Swift 的标准通用 Array<Element>
=> https://developer.apple.com/documentation/swift/array
我是否可以考虑创建一个结构而不是使用字典:
import Foundation
struct Obj {
let id: Int
let name: String
}
let array = [
Obj(id: 1, name: "x1"),
Obj(id: 2, name: "x2"),
Obj(id: 3, name: "X3"),
Obj(id: 4, name: "y1"),
Obj(id: 5, name: "y2")
]
let filteredArray = array.filter { [=10=].name.localizedLowercase.hasPrefix("x") }
// filteredArray = [
// Obj(id: 1, name: "x1"),
// Obj(id: 2, name: "x2"),
// Obj(id: 3, name: "X3")
// ]
否则你会得到这样的东西:
import Foundation
let array: [[String: Any]] = [
[ "id": 1, "name": "x1" ],
[ "id": 2, "name": "x2" ],
[ "id": 3, "name": "X3" ],
[ "id": 4, "name": "y1" ],
[ "id": 5, "name": "y2" ]
]
let filteredArray = array.filter { ([=11=]["name"] as? String)?.localizedLowercase.hasPrefix("x") == true }
我想使用键值在 NSMUtableArray
上进行搜索以捕获孔对象,而不仅仅是一个值数组,例如我的 NSMUtableArray
return 我
{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}
{id : 4, name : y1}
{id : 5, name : y2}
如果我正在搜索 x 我的代码 return 我
{x1,x2,x3}
或者我想要 return
{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}
我的代码是:
let arrayy = lstResults.value(forKey: "name")
let searchTest = NSPredicate(format: "SELF BEGINSWITH [c] %@", searchBar.text!)
let array = (arrayy as! NSArray).filtered(using: searchTest)
filteredTableDataName = array as NSArray
请帮助我尝试了很多东西,但没有任何效果。
您可以直接过滤数组,而不是提取和过滤 "name"
值,使用相应的键路径而不是谓词中的“SELF”:
let array = NSArray(array: [
["id": 1, "name": "x1"], ["id": 2, "name": "x2"], ["id": 3, "name": "y3"]])
let predicate = NSPredicate(format: "name BEGINSWITH [c] %@", "x")
let filtered = array.filtered(using: predicate)
print(filtered)
结果:
[{
id = 1;
name = x1;
}, {
id = 2;
name = x2;
}]
另一种选择是将 NS(Mutable)Array
转换为 Swift 字典数组,并使用 filter()
函数:
if let a = array as? [[String: Any]] {
let filtered = a.filter {
([=12=]["name"] as? String)?
.range(of: "x", options: [.caseInsensitive, .anchored]) != nil
}
print(filtered)
// [["id": 1, "name": x1], ["name": x2, "id": 2]]
}
NSMutableArray
(或 NSArray
就此而言)是 'Objective-c' 时代的遗留物。
为此目的,没有真正需要使用它或不使用 Swift 的标准通用 Array<Element>
=> https://developer.apple.com/documentation/swift/array
我是否可以考虑创建一个结构而不是使用字典:
import Foundation
struct Obj {
let id: Int
let name: String
}
let array = [
Obj(id: 1, name: "x1"),
Obj(id: 2, name: "x2"),
Obj(id: 3, name: "X3"),
Obj(id: 4, name: "y1"),
Obj(id: 5, name: "y2")
]
let filteredArray = array.filter { [=10=].name.localizedLowercase.hasPrefix("x") }
// filteredArray = [
// Obj(id: 1, name: "x1"),
// Obj(id: 2, name: "x2"),
// Obj(id: 3, name: "X3")
// ]
否则你会得到这样的东西:
import Foundation
let array: [[String: Any]] = [
[ "id": 1, "name": "x1" ],
[ "id": 2, "name": "x2" ],
[ "id": 3, "name": "X3" ],
[ "id": 4, "name": "y1" ],
[ "id": 5, "name": "y2" ]
]
let filteredArray = array.filter { ([=11=]["name"] as? String)?.localizedLowercase.hasPrefix("x") == true }