为什么NSRect和CGRect是不兼容的类型?

时间:2010-08-21 17:38:34

标签: objective-c cocoa

好的,我对错误表示反对:

  

错误:参数的类型不兼容   'initWithFrame:'

中的1个

这就是导致它的原因:

operationLabel = [[NSTextField alloc] initWithFrame:CGRectMake(0, self.frame.size.height / 2 - (40 * 3), self.frame.size.width, 100)];

定义是:

- (id)initWithFrame:(NSRect)frameRect;

所以第一个参数是NSRect,让我们检查一下:

typedef CGRect NSRect;

怎么会导致错误? 它们的名称相同,类型相同!

3 个答案:

答案 0 :(得分:11)

除了zoul的回答,我还以为我会提到Apple的两个辅助函数(宏?)(从10.5开始):

NSRect NSRectFromCGRect(CGRect cgrect)
CGRect NSRectToCGRect(NSRect nsrect)

答案 1 :(得分:9)

NSRectCGRect的类型相同,如果为iOS构建,对于64位Mac架构,或者将具有宏NS_BUILD_32_LIKE_64的32位Mac架构定义为1在命令行或前缀标题中。

或者,引用NSGeometry.h:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

答案 2 :(得分:3)

您从哪里获得NSRect的typedef定义?根据文档NSRect定义如下:

typedef struct _NSRect {
      NSPoint origin;
      NSSize size;
} NSRect;

换句话说,它的结构看起来就像CGRect(但不是普通的typedef)。已经写了一些关于conversions between CGRect and NSRect的文章。