2013-07-05 69 views
1

如何找出結構是否爲特定類型?換句話說,如果我得到一個對象,我怎麼知道這個下層的類型是一個結構?Struct isKindOfClass

+(BOOL)isPrimitive:(id)input 
{ 
    return [input isKindOfClass:[NSNumber class] ] || [input isKindOfClass:[NSDate class]] || [input isKindOfClass:[NSString class]] 
     || __IS_THIS_A_STRUCT__ (specifically SEL); 
} 

我應該到位的IS_THIS_A_STRUCT

+1

它不可能是結構。或者你真的做錯了。 'id'必須是一個指向ObjC對象的指針。否則你的編譯器會警告你。但是,struct可以用'NSValue'包裝,也許這就是你想測試的。 –

+0

'SEL'不是結構體,它們是'char *'。可能不可能確定某個對象是否是某個對象,因爲我可以通過一個isa指針傳遞一些結構,並且一切都會很好。 – CodaFi

+0

我克隆一個對象,它的一些屬性是類型選擇器。這種方法應該通過選擇器(和字符串/日期/等)轉移到克隆的對象。我應該怎麼做? – user2453876

回答

1

根據你的意見,它看起來像你知道一個屬性,並希望以某種方式行事,如果它返回一個結構。如果是這樣,那麼你可以這樣做:

if(!strcmp([[self class] 
    instanceMethodSignatureForSelector:@selector(propertyName)].methodReturnType, 
    @encode(SEL))) 

@encode返回type encoding爲命名類型,它是一個C字符串。 instanceMethodSignatureForSelector返回一個NSMethodSignature,它可以將該方法的返回類型指定爲編碼類型。

這兩種類型的編碼不保證具有相同的標識,但具有相同的值。所以你可以使用C函數strcmp來檢查它們是否相同。如果在編譯時未知選擇器名稱,則可以使用NSSelectorFromString