2010-09-03 34 views
1

我試圖在if語句中聲明一個變量。如果查詢的結果是YES,那麼該對象將是一種類型,否則它將是另一種類型。像這樣的位......在if語句中聲明對象類型

if (YES) { 
      ObjectTypeA *object = [[ObjectTypeA] alloc] init]; 
} 

else { 
     ObjectTypeB *object = [[ObjectTypeB] alloc] init]; 
} 

一旦這樣做了我想使用相同的方法的對象,不管它是什麼類型。我試圖在if語句之前聲明對象爲id,但得到一個錯誤:成員引用類型'struct objc_object *'是一個指針;也許你打算使用' - >'?

我也嘗試聲明兩個都是獨立的對象之外,然後使指針指向我知道的任何一個。那也行不通。

我知道編譯器試圖通過這樣做來保護我自己,但在這種情況下,我需要繞過它。

謝謝。

+0

打破瞭解決此問題曾任職檢測,即是或否爲單獨的方法。然後根據YES或NO聲明每個方法中的對象。 – 2010-09-03 22:17:08

+0

感謝所有花時間留下答案的人。 – 2010-09-03 22:17:29

回答

3

Cocoa/Cocoa Touch中這個問題最常見的模式是定義一個協議。

協議是可以由任何對象實現的方法的集合。

如果您讓ClassA和ClassB符合包含您需要他們回覆的方法的協議,那麼您不必擔心獲得哪種類型的對象。

這個想法是「如果它看起來像一隻鴨子,嘎嘎叫鴨子,那麼它可能是一隻鴨子」。

您可以使用動態類型和創建根據您的查詢的結果,你的對象,但要確保所產生的對象符合特定的協議,就像這樣:

id <MyProtocol> myObject; 

if (YES) 
    myObject = [[ClassA alloc] init]; 
else 
    myObject = [[ClassB alloc] init]; 

[myObject myMethod]; 
[myObject release]; 
1

我覺得這個代碼應該很好地工作:

id obj = nil; 

if (YES) { 
    obj = [[ObjectTypeA] alloc] init]; 
} else { 
    obj = [[ObjectTypeB] alloc] init]; 
} 

[obj performSelector:@selector(YOUR_METHOD) withObject:YOUR_OBJECT]; 
+0

在提問者的代碼中提到另一個錯誤可能是有用的,因爲在if/else內定義的變量將超出if/else之外的範圍。 – Jasarien 2010-09-03 14:03:14

+0

我不確定,但是解釋說了一些關於在外面聲明的內容:「還試圖聲明兩者都是獨立於if之外的對象,然後使指針指向我知道的那一個,這也行不通。「我真的沒有得到它,所以我再次寫入 – vodkhang 2010-09-03 14:11:12

+0

你可以直接調用方法,在這種情況下'performSelector:'不是必需的。 – Sven 2010-09-03 18:02:13

0

你要動態類型:)

解決這個問題的方法是聲明第三個對象,這兩個從

或繼承

您可以使用適配器模式並創建一個接受這兩個對象作爲成員的對象,然後將您希望調用的函數包裝到該對象中

祝你好運!

- >這些是通用OO解決方案;我不是Objective-C開發人員