2010-04-07 74 views
2

我有一个方法返回一个NSRange。当我从课外调用这个方法时,我得到一个编译错误。一个方法可以返回一个NSRange吗?

NSRange tmpRange; 
tmpRange = [phrase rangeInString:searchString forString:theLetter goingForward:YES]; 
return tmpRange.location == -1; 

在h文件:

#import <Foundation/Foundation.h> 


@interface Phrase : NSObject { 

} 
- (NSRange) rangeInString:(NSString *) tgt forString:(NSString *) find goingForward:(BOOL) fwd; 

@end 

此方法由其它方法乐句对象内调用没有问题。编译器说'赋值中的不兼容类型'。

任何人都可以解释这一点吗?我假设它与返回在对象外生成的NSRange /结构类型值有关,但我不知道它为什么在一个地方而不是另一个地方工作。

+0

注意,通常你应该使用'NSNotFound'作为'location'字段值无效的' NSRange'。 – 2010-04-08 02:15:16

+0

嗯 - 对于各种低质量的原因,我实际上将位置值用作一种错误代码:-1就是这样一种代码。所有的代码都小于零。这与错误无关,因为编译器不知道在运行时会返回什么。但这就是为什么我没有使用NSNotFound ... – 2010-04-08 04:22:46

+1

位置变量被定义为一个NSUInteger,所以它永远不会小于零。你应该使用NSNotFound。 – 2010-04-08 20:56:25

回答

5

当然,一个方法可以返回NSRange。但是返回结构需要特别注意编译器,因为调用方法通常是不同的(objc_msgSend_stretobjc_msgSend)。

请确保您声明phrase作为

Phrase* phrase = ...; 

让编译器知道-rangeInString:…是返回一个NSRange,而不是

id phrase = ...; 

(此外,由于你不显示其中一线编译器错误,请确保使用return … == -1;的函数返回的BOOL不是NSRange。)

+0

您还需要确保将包含Phrase接口的头文件导入到调用该方法的文件中。 – 2010-04-07 23:16:03

+0

短语已导入 - 请参阅下面的评论。短语的实例已经被声明,并且在其他方​​法中,对同一类别中的短语实例进行多次引用。 引发错误的行是将tmpRange分配给方法调用的结果的行。 – 2010-04-08 04:18:11

+0

@Dan:你如何声明**变量**'短语'? – kennytm 2010-04-08 05:45:32

2

一个方法可以返回一个NSRange吗?

是的。

该方法在短语对象内通过其他方法调用没有问题。 ...当我从课堂外调用这个方法时,我得到一个编译错误。 ...编译器说'赋值中的不兼容类型'。

记住#import将Phrase.h放入与Phrase对象交谈的实现文件中。否则,编译器不知道您的rangeOfString:forString:goingForward:方法,并且假定它返回id。它需要@interface的头文件中的知道该方法返回NSRange

假设您的短语对象位于实例变量中,您可能在声明了伊娃的头文件中声明了使用@class Phrase;的短语类。这是一个前向宣言;它告诉编译器存在一个名为“Phrase”的类(所以像Phrase *myPhrase这样的声明将是合法的),但它并没有告诉编译器关于它的任何其他信息。为此,您需要导入标题。

关于A类知道B类实例的一般规则是A的头(A.h)用@class转发声明B类,A的实现(A.m)用于导入B的头(B.h)。

另一种情况是,当A是B的子类时,您需要@interface来创建一个子类,所以在这种情况下,只有这种情况下,A.h必须输入B.h.由于它为B导入标题,因此不需要转发声明B.

+0

实际上,短语类是导入的,没有用@class声明。非短语类导入短语,短语不导入其他类(只是基础)。短语声明返回值是一个NSRange。调用短语类方法的类存储短语的一个实例,称为短语。 – 2010-04-08 04:15:11

1

我不认为这是答案,但NSRange.location声明为NSUInteger。通过将其与-1进行比较,您将比较无符号值和有符号值。

我能想到的唯一的其他答案是您正在进行调用的.m文件没有导入头Phrase.h。现在,我知道你相信它已经存在了,但是编译器在说另外的话。尝试在文件上运行预处理器以查看它实际导入的内容。 (在包含.m文件的编辑器中右键单击 - 预处理接近弹出的上下文菜单的底部)。

1

是的,你可以在方法中返回C结构。这不是问题。此外,位置是一个NSUInteger,永远不会是-1。使用NSNotFound来测试。

你的Phrase对象的实例是如何输入的?您是否使用id而不是Phrase *?您是否正确导入了短语标题?

你应该给我们提供关于编译错误的代码的更多信息。

1

在回答一些问题,都上来了:

#import <Foundation/Foundation.h> 
#import "OverlayView.h" 
#import "Phrase.h" 
#import "TimerPaneView.h" 

是在MainPane.h头,类头呼叫正在取得地方。

在为MainPane.h头,那句声明:

Phrase    *phrase; 

并在实施文件,其中,是的,进口MainPane头:

phrase = [[Phrase alloc] init]; 

是怎样的短语类正在被实例化,在initWithFrame方法中。我指的是几十次,几十次的对象,调用方法,指的是这个类中的属性,没有问题。不,这个短语对象直到dealloc才会被释放。

- 补充说:我认为我发现了这个问题:从未被调用过的代码的折叠部分的遗留返回值是BOOL。此方法最初返回BOOL,但已转换。但是我消除了它,问题仍然存在。

我还要说,我已经重构我解决这个问题的方法,但它仍然是一个谜......

相关问题