2013-12-18 57 views
-2

爲邏輯延續的問題:我們瞭解到,我們可以做以下 Objective-C dynamic_cast?與目標C動態類中聲明變量

從那裏:

MyClass *safeObject = objc_dynamic_cast(originalObject, MyClass); 

讓我們假設層次結構:A - > B,A - > C,A - > D.

功能是

​​

其中對象是從來沒有A,但總是B,C或D.

的問題是如何在Objective-C表示(在iOS尤其)以下想法:

Class class = [object class]; 
class *safeObject = objc_dynamic_cast(object, class); 

其中 「類」 是B,C或D.

+1

我不會說「爲什麼你要這個,這是不相關的,這是不必要的」 –

回答

0

您正在使用太複雜的東西。一切都很簡單:

if ([object isKindOf:[B class]]) 
{ 
    B* bObject = (B*)object; 
} 
+0

我不想使用if塊。我有大約15個小類,隨着應用程序的需求,這個數字也在增長。硬編碼15以上,如果塊不是一個好的解決方案。但是謝謝你的時間。 – Dumoko

+0

@Dumoko任何你需要15個不同的處理函數的函數' - (void)someStuffWith:(A *)對象;'嘗試不同的想法。在你的情況下,你需要在A類中使用someStuff方法,並且子類應該實現它。 –

+0

反正我不需要15個不同的處理程序來完成我的功能。當我找到一個聲明動態類變量的方法時,我只有2行: Class class = [object class]; * safeObject = objc_dynamic_cast(object,class); 而不是15個處理程序/函數/ ifelses。 我很欣賞你對不同想法的想法,但請看問題中的最後2行,mb,你會明白這一點。 – Dumoko

2

這不是你應該這樣做的方式。相反,你應該做的:

- (void)someStuffWith:(id<MyProtocol>)object; 

而且MyProtocol的定義上必須存在object,也許一些可選的方法,以及(你可以用[object respondsToSelector:]檢查)的所有方法的列表。

或者還有另一種解決方法,如果您告訴我們更多關於您的實際問題的信息,而不是您想要解決問題的方法,這將有所幫助。 Objective-C已有30年曆史,你永遠不會遇到這樣的問題,即該語言沒有一個完美的解決方案。停止嘗試發明新的解決方案並學習嘗試過的和真正的解決方案。 :-)

+0

http://stackoverflow.com/questions/20653604/activerecord-crash-on-validating-name-field。一些子類有一個屬性「名稱」。父類(ActiveRecord)沒有。我試圖看看它是否會崩潰,如果我實際上將ActiveRecord對象轉換爲aRecord實例的實際類。 Mb這樣,「name」的「valueForkey」將停止崩潰。這就是爲什麼你的解決方案也不適合我的問題,但謝謝你試圖幫助我!期待您的想法! – Dumoko

+2

'isRespondsToSelector'將幫助你 –

+0

它不會。 NSObject總是響應選擇器「valueForKey」。我的問題是它對於某個屬性這樣做會崩潰。請注意,它有時候會這樣。再現的百分比非常小,大約是驗證記錄的時間的0.01%。 – Dumoko