FilterArrayUsingPredicate не существует в быстром массиве
У меня есть структурные объекты "UserDetails" в массиве. Я хочу отфильтровать объекты из массива. Но в массиве Swift нет опции "filterArrayUsingPredicate".
Создание массива
var arrayOfUsers:UserDetails[] = UserDetails[]()
мой код userdetails
struct UserDetails{
var userName:String
var userID:String
var userAge:String
func userDescription()->String{
return "name " + userName + "age " + userID
}
}
мой код для создания объектов
for a in 1...1000{
var user:UserDetails = UserDetails(userName: "name", userID: String(a), userAge: "22")
arrayOfUsers.append(user)
}
Теперь я хочу отфильтровать arrayOfUsers
, у которого есть идентификатор пользователя "1".
Ответы
Ответ 1
У массивов Swift есть метод .filter
, который принимает замыкание - это будет делать это:
let filteredArray = arrayOfUsers.filter() { $0.userID == "1" }
Закрытие может быть упрощено различными способами. Полное объявление закрытия будет выглядеть следующим образом:
var filteredArray = arrayOfUsers.filter( { (user: UserDetails) -> Bool in
return user.userID == "1"
})
Разница между двумя заключается в том, что первый использует синтаксис закрывающего закрытия, сокращенные имена аргументов, вывод типа и неявный возврат. Вы можете прочитать больше о закрытии документации Apple Swift.
Ответ 2
вы также можете использовать NSPredicate
var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"];
var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"];
var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"];
var attributeValue = "karthi";
var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict];
var namePredicate =
NSPredicate(format: "firstName like %@",attributeValue);
let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) };
println("names = ,\(filteredArray)");
//фильтрация структуры
struct myStruct
{
var userid:String;
var details:String;
init() {
userid = "default value";
details = "default";
}
};
var f1 = myStruct();
f1.userid = "1";
f1.details = "Good boy";
var f2 = myStruct();
f2.userid = "2";
f2.details = "Bad boy";
var arrNames1:Array = [f1,f2];
let filteredArrayStruct = arrNames1.filter( { (user: myStruct) -> Bool in
return user.userid == "1"
})
println("filter array count = \(filteredArrayStruct.count)");
for filteredValues in filteredArrayStruct
{
println("filteredArrayStruct = ,\(filteredValues.details)");
}
Ответ 3
Если вы фильтруете словарь, вы можете сделать это следующим образом.
var visitors = [["age" : 22], ["age" : 41], ["age" : 23], ["age" : 30]]
var filteredVisitors = visitors.filter({
$0["age"] < 30
})
println(filteredVisitors)
//[["age" : 22], ["age" : 23]]
Хорошо то же самое относится к структурам, в которых вы будете фильтровать его свойство
struct Person {
var age : Int?
init(age: Int) {
self.age = age
}
}
var eventAttendees = [Person(age: 22), Person(age: 41), Person(age: 23), Person(age: 30)]
var filteredAttendees = eventAttendees.filter({
$0.age < 30
})
Вы можете обратиться к этим статьям за дополнительной информацией. Фильтрация Swift Array из словарей или свойства объекта
Ответ 4
Как оказалось, вам не нужно сравнивать только один фильтр за раз. Вы можете применять логические условные обозначения для расширения области предиката. Например:
var foundArray = tempArray.filter{ String(describing:$0.id) .contains(searchText) ||
$0.name .contains(searchText) || $0.summary! .contains(searchText) ||
String(describing: $0.airDate).contains(searchText) || String(describing: $0.airTime).contains(searchText) ||
String(describing: $0.runTime).contains(searchText)}
работает как чемпион.
Ответ 5
В быстрых 3 или 4 вы можете использовать NSPredicate с Массив
let pred : NSPredicate = NSPredicate(format: "points_status = %@", "0")
let approvalRequestArray = approvalRequestOriginalArray.filtered(using: pred) as NSArray
let provincesStartingWithM = NSPredicate(format: "name contains [cd] 'a'")
provinces.filtered(using: provincesStartingWithM)
За дополнительной информацией вы можете перейти по этой ссылке
GitHub