繁体   English   中英

一个方法可以返回NSRange吗?

[英]Can a method return an 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

通过其他方法在Phrase对象中调用此方法没有问题。 编译器说“赋值中的不兼容类型”。

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

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

请确保将phrase声明为

Phrase* phrase = ...;

所以编译器知道-rangeInString:…正在返回一个NSRange,而不是

id phrase = ...;

(另外,由于您没有显示编译器错误的哪一行,请确保函数使用return … == -1;返回BOOL而不是NSRange。)

一个方法可以返回NSRange吗?

是。

通过其他方法在Phrase对象中调用此方法没有问题。 ...当我从类外部调用此方法时,我收到编译错误。 ...编译器说“赋值中的不兼容类型”。

记得#import Phrase.h到你正在与一个Phrase对象交谈的实现文件中。 否则,编译器不知道你的rangeOfString:forString:goingForward:方法并假定它返回id 它需要头文件中的@interface才能知道该方法返回NSRange

假设你的短语对象在一个实例变量中,你可能用@class Phrase;声明了Phrase类@class Phrase; 在您声明ivar的头文件中。 那是一个前瞻性声明; 它告诉编译器存在一个名为“Phrase”的类(因此像Phrase *myPhrase这样的声明是合法的),但是它并没有告诉编译器有关它的任何其他内容。 为此,您需要导入标题。

一般规则,对于知道B类实例的A类实例,A的标题(Ah)用@class正向声明B类,A的实现(Am)用于导入B的标题(Bh)。

另一种情况是当A是B的子类时。你需要@interface来创建一个子类,所以在这种情况下只有这种情况,啊必须导入Bh因为它导入了B的头,它不需要转发 -声明B.

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

我能想到的唯一其他答案是你正在进行调用的.m文件没有导入标题Phrase.h。 现在,我知道你相信它,但编译器却说不然。 尝试在文件上运行预处理器以查看它实际导入的内容。 (右键单击包含.m文件的编辑器 - 预处理位于弹出的上下文菜单的底部附近)。

是的,您可以在方法中返回C结构。 那不是问题。 此外,location是NSUInteger,永远不会是-1。 使用NSNotFound来测试它。

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

您应该向我们提供有关给出编译错误的代码的更多信息。

针对即将出现的一些问题:

#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,但已转换。 但是我把它消灭了,问题仍然存在。

我还应该说我已经重新解决了这个问题,但它仍然是一个谜......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM