Кроссплатформенная категория 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];