Ios 跨平台价值类别

Ios 跨平台价值类别,ios,cocoa,cgpoint,cgsize,nsvalue,Ios,Cocoa,Cgpoint,Cgsize,Nsvalue,我正在尝试创建一个跨平台的NSValue类别,用于处理Cocoa和iOS的CGPoint/NSPoint和CGSize/NSSize等 我有这个: #ifdef __MAC_OS_X_VERSION_MAX_ALLOWED // Mac OSX + (NSValue *) storePoint:(NSPoint)point { return [NSValue valueWithPoint:point]; } + (NSPoint) getPoint { return (NSPoint

我正在尝试创建一个跨平台的NSValue类别,用于处理Cocoa和iOS的CGPoint/NSPoint和CGSize/NSSize等

我有这个:

#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没有已知的类方法和“used”类型CGPoint(又名struct CGPoint),其中需要算术或指针类型

为什么呢

+ (CGPoint) getPoint {
  return (CGPoint)[self CGPointValue];
}
您的变量以maj开头?将变量设置为min不是更好吗?这可能是CGPoint类的问题

[self cgPointValue];

因为
+[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和NSPOINT是相同的,您不需要更多,也不需要修改OS X代码

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

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

NSValue类上没有CGPointValue方法。@HutinPuylo在中有。@HutinPuylo它在这里:啊,好吧,但出于好奇,为什么Xcode在为Cocoa编译时没有给我任何错误?@RubberDuck我不知道……也许Xcode不知何故认为
self
id
(未键入)因此没有执行类型检查。没有。这。您不能只更改名称。问题是它是一个实例方法,而不是类方法。