Самый эффективный способ преобразовать значение x NSValue CGPointValue в NSNumber - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть массив с кучей объектов NSValue. Эти объекты по сути являются обертками для CGPoints. Мне нужно создать NSDictionary из этих CGPoints, который записывает те точки, которые имеют наибольшее значение х для данного значения у. Например, может быть несколько точек, которые имеют одно и то же значение y, но только та, которая имеет наибольшее значение x для этого значения y, должна быть записана в NSDictionary. В конечном счете, значение y является ключом, а значение x является значением этого ключа.

Когда я перебираю массив объектов NSValue, мне нужно сравнить их значения x со значением x записи NSDictionary, имеющей такое же значение y (и, если она не существует, создать эту запись). Для этого я использую метод objectForKey объекта NSDictionary. Но этот метод требует объект типа id (необъявленный объект). Что подводит меня к вопросу.

Объект типа id, который я собираюсь передать методу objectForKey, является просто значением y в CGPoint. Но я получаю это значение y, сначала преобразовав объект NSValue в CGPoint. Поэтому, как только я это сделаю, я должен преобразовать это значение y обратно в объект (т.е. NSNumber numberWithFloat). Это кажется мне неэффективным - преобразование объекта в CGPoint для извлечения CGFloat, который затем возвращается обратно в объект через NSNumber.

Есть ли лучший способ сделать это?

Вот мой текущий код:

for (NSValue *pt in myArrayOfPoints) {
    NSNumber *y = [NSNumber numberWithFloat:[pt CGPointValue].y];
    if ([leftSideEdgePtsFurthestInwards objectForKey:y] == nil) {
    //yada yada yada
    }
}
...