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

Kri*_*oks 7 cocoa objective-c

好吧,我对一个错误感到厌烦:

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

这是导致它的原因:

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

定义是:

- (id)initWithFrame:(NSRect)frameRect;
Run Code Online (Sandbox Code Playgroud)

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

typedef CGRect NSRect;
Run Code Online (Sandbox Code Playgroud)

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

Eik*_*iko 11

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

NSRect NSRectFromCGRect(CGRect cgrect)
CGRect NSRectToCGRect(NSRect nsrect)
Run Code Online (Sandbox Code Playgroud)


Jen*_*ton 9

NSRectCGRect为iOS构建,64位Mac架构或具有宏的32位Mac架构NS_BUILD_32_LIKE_64在命令行或前缀头中定义为1的类型相同.

或者,引用NSGeometry.h:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
Run Code Online (Sandbox Code Playgroud)