2010-04-07 49 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,但已轉換。但是我消除了它,問題仍然存在。

我還要說,我已經重構我解決這個問題的方法,但它仍然是一個謎......

相關問題