[英]NSArray of objects and Casting
我有一個帶有屬性NSString *name
A
類。 如果有一個NSArray
並在這個數組中添加了許多A
對象,那么每次檢索對象時都需要進行強制轉換嗎? 即
NSString* n = (NSString*)[arr objectAtIndex:1];
或者是否有另一種方法可以在java中使用ArrayList<A> arr
?
NSArray
不存儲有關其中包含的對象類型的信息。 如果您確定數組中的對象類型,則可以隱式或顯式執行強制轉換:
NSString *n = [arr objectAtIndex:1]; // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1]; // explicit cast
隱式和顯式轉換之間的運行時成本沒有區別,只是風格問題。 如果你輸入的類型不對,那么很可能會發生的事情是你會將可怕的unrecognized selector sent to instance 0x12345678
異常。
如果您有不同類型對象的異構數組,則需要使用isKindOfClass:
方法來測試對象的類:
id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
// It's an NSString, do something with it...
NSString *str = obj;
...
}
NSArray
的objectAtIndex:
返回id
類型的變量。 這將是大致相當於返回一個Object
在Java的“我們不能保證許多關於這個變量的類型。” 但是,在Objective-C中,您可以在沒有編譯器抱怨的情況下向id
變量發送消息。 因此,因為您知道該數組只包含A
實例,所以您最好向其發送name
消息。 例如,以下內容將在沒有警告的情況下編譯:
NSString *name = [[array objectAtIndex:0] name];
但是,如果要使用點表示法(例如[array objectAtIndex:0].name
),則需要將id
轉換為A *
,如下所示:
NSString *name = ((A *)[array objectAtIndex:0]).name;
這是做到這一點的方法。 實際上,您可以在不轉換返回的情況下執行上述操作,因為無論如何您都要將其讀入NSString。
這是方式:
NSMutableArray *objectsArray = [[NSMutableArray alloc] init];
A *a= [[A alloc] init];
[objectsArray addObject:a];
[a release];
您不必擔心屬性類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.