фильтрация NSArray в новый NSArray в Objective C

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
117
задан Cœur 9 August 2019 в 03:37
поделиться

2 ответа

NSArray и NSMutableArray предоставляют методы для фильтрации содержания массива. NSArray обеспечивает filteredArrayUsingPredicate: , который возвращает новый массив, содержащий объекты в получателе, которые соответствуют указанному предикату. NSMutableArray добавляет filterUsingPredicate: , который оценивает receiver’s содержание против указанного предиката и оставляет только объекты тем соответствием. Эти методы проиллюстрированы в следующем примере.

NSMutableArray *array =
    [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];

NSPredicate *bPredicate =
    [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
    [array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.

NSPredicate *sPredicate =
    [NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
137
ответ дан Niall Kiddle 24 November 2019 в 02:04
поделиться

Предположение, что Ваши объекты все имеют подобный тип, Вы могли добавить метод как категорию их базового класса, который вызывает функцию, которую Вы используете для своих критериев. Тогда создайте объект NSPredicate, который обращается к тому методу.

В некоторой категории определяют Ваш метод, который использует Вашу функцию

@implementation BaseClass (SomeCategory)
- (BOOL)myMethod {
    return someComparisonFunction(self, whatever);
}
@end

Тогда везде, где Вы будете фильтровать:

- (NSArray *)myFilteredObjects {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMethod = TRUE"];
    return [myArray filteredArrayUsingPredicate:pred];
}

, Конечно, если Ваша функция только выдерживает сравнение со свойствами, достижимыми из Вашего класса, может просто быть легче преобразовать условия функции в строку предиката.

16
ответ дан Ashley Clark 24 November 2019 в 02:04
поделиться