2010-05-27 114 views
0

在c#我可以聲明object o;然後我可以分配o=(float)5.0;o="a string."是否有Objective-C的等價物?我試圖使用id,但它不採用像float或integer這樣的基本類型。感謝您的幫助。目標C中C#中的對象的等價物是什麼?

+0

'可以'並不意味着'應該';對象的自由使用可能會導致運行時錯誤,這些錯誤可能在編譯時使用更具體的類型來捕獲。 – 2010-05-28 09:44:42

+0

我相信我不是唯一需要這個人的人。原因是我正在開發一個平臺。我試圖在我的最後做更多的工作,所以我的客戶會少做。 – 2010-05-29 11:33:23

回答

11

Objective-C沒有CLR中的「統一類型系統」。換句話說,作爲C的一個超集,Objective-C的基本類型與對象實例完全不同的是百獸。 id類型可以將引用(OS X/iPhone Objective-C運行時中的真正指針)存儲到任何對象實例。 C的原始類型(例如int,float等)必須被包裝在NSValueNSNumber中,以被分配到類型id。當然,這正是C#編譯器正在做的。這只是在C#中,你不必顯式地進行(un)boxing轉換。

很快,像

float val; 
id obj = [NSNumber numberWithFloat:val]; 
... 
float v = [obj floatValue]; 

代碼將成爲第二天性,如果按現代標準遺憾的是冗長。

+0

謝謝巴里。我最終完成了你的建議。由於我需要在數組中存儲c類型數據的混合包,因此一旦將數據類型轉換爲NSNumber,就可以輕鬆地檢測數據類型了嗎? – 2010-05-29 11:52:12

+0

'NSNumber'是'NSValue'的一個子類,所以你可以使用'-objCType'和C字符串比較來確定實際的數字類型...很漂亮的老派,但它的工作原理。 Objectie-C希望感受到動態類型和C的靜態類型相互衝突的情況。 – 2010-05-30 05:24:22

3

有沒有真的這樣的事情。您可以使用NSNumberNSValue將原生數據類型處理爲對象。 NSString會做字符串。您可以將所有這些分配給一個id類型變量,但您需要使用正確的類init方法創建它們。

3

你是對的,id只適用於ObjC對象引用。如果你想引用一個帶有id引用的int,你需要把它放入一個NSNumber。順便提一下,C#也是對這些原語進行裝箱,它只是自動進行。

2

回到我的日子,我們不得不在冰雪上行走15英里,上山,使用void pointers。哦,我們沒有StackOverflow!

+0

不回答這個問題,但我喜歡它:) – Ben 2010-05-27 23:25:28

+0

我喜歡這個,但我必須-1因爲不回答這個問題。 (嘗試製作CW,然後我會調高它) – OscarRyz 2010-05-28 02:30:09

+0

+1因爲世界是一個更好的地方,有一些幽默感。 – JeremyP 2010-05-28 07:29:02

1

實際上,C#數據類型只是它們各自類的別名,這就是它們可以分配給對象類型的原因。例如,int實際上是一個名爲Int32的類。

正如前面提到的@Barry,Objective-C的情況並非如此。

相關問題