Кроссплатформенная категория NSValue

Я пытаюсь создать кроссплатформенную категорию NSValue, которая будет обрабатывать CGPoint/NSPoint и CGSize/NSSize и т. Д. Для Какао и iOS.

У меня есть это:

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
// Mac OSX

+ (NSValue *) storePoint:(NSPoint)point {
  return [NSValue valueWithPoint:point];
}

+ (NSPoint) getPoint {
  return (NSPoint)[self pointValue];
}


#else
// iOS

+ (NSValue *) storePoint:(CGPoint)point {
  return [NSValue valueWithCGPoint:point];
}

+ (CGPoint) getPoint {
  return (CGPoint)[self CGPointValue];
}


#endif

Часть Mac работает отлично, но часть iOS выдает ошибку

  return (CGPoint)[self CGPointValue];

с двумя сообщениями: 1) нет известного метода класса для селектора CGPointValue и "используется тип CGPoint (он же struct CGPoint), где требуется арифметика или тип указателя.

это почему?

3 ответа

Решение

Так как +[NSValue CGPointValue] не существует, вы хотите -[NSValue CGPointValue]

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
// Mac OSX

+ (NSValue *) storePoint:(NSPoint)point {
  return [NSValue valueWithPoint:point];
}

- (NSPoint) getPoint { // this should be instance method
  return (NSPoint)[self pointValue];
}


#else
// iOS

+ (NSValue *) storePoint:(CGPoint)point {
  return [NSValue valueWithCGPoint:point];
}

- (CGPoint) getPoint { // this should be instance method
  return (CGPoint)[self CGPointValue];
}


#endif

Чтобы упростить задачу, просто создайте категорию, предназначенную только для iOS, и используйте те же имена методов, что и в OS X, поскольку для OS X точки CGPoint и NSP одинаковы, вам не нужно больше, и вам не нужно изменить ваш код OS X

@implementation NSValue (XCross)
#if TARGET_OS_IPHONE
+ (NSValue *) valueWithPoint:(CGPoint)point {
    return [NSValue valueWithCGPoint:point];
}

- (CGPoint) pointValue {
    return [self CGPointValue];
}
#endif
@end
+ (CGPoint) getPoint {
  return (CGPoint)[self CGPointValue];
}

Ваша переменная начинается с майора? не лучше ли установить вашу переменную с мин. Это может быть проблема с классом CGPoint.

[self cgPointValue];
Другие вопросы по тегам