2010-04-28 26 views
3

是否可以指定NSMutableArray只能包含特定類型的對象。 例如,如果我想只存儲這樣的對象:只有特定類型的對象的NSMutableArray

@interface MyObject : NSObject { 
    UInt8 value; 
} 

爲了能夠使用這樣的實例變量:

- (void)myMethod:(NSMutableArray *)myArray{ 
    for (id myObject in myArray){ 
     [self otherMethod:myObject.value]; 
    } 
} 

,因爲我得到這個錯誤:

request for member 'value' in something not a structure or union 

謝謝您的幫助

回答

7

您正在收到該錯誤,因爲就Objective-C而言,myObject屬於非類型id,它不支持value屬性。爲了讓Objective-C知道它總是在這個循環中處理一個MyObject,你必須告訴它myObject對象是MyObject的一個實例。

for (MyObject *myObject in myArray) { 

而且,你必須確保value伊娃是訪問通過實施其getter和setter方法使用點符號。您可以通過執行-value-setValue:來完成此操作,也可以使用@property@synthesize來讓Objective-C執行此操作。

0

的Objective-C不喜歡工作這一點。您需要使用[myObject value](將工作不論種類的對象,只要它響應-[value]。如果你只想要一個類型它的對象,只插入該類型的對象。

+0

[myObject的值]沒有工作......因爲有其他的選擇這個方法......我改名我的實例變量在「myValue」和現在的[myObject myValue]中起作用.. – leochab 2010-04-28 12:35:16

+0

在Objective-C 2中引入,您還可以使用點符號來實際訪問屬性或任何不需要參數的方法。所以'myObject.value'在語法上是非常好的。僅當編譯器知道接收器類型時,纔出於某種原因,只能使用 – 2010-04-28 13:13:00

+0

。 – 2010-04-28 13:30:55

0

你將不得不可可寫一個包裝類爲NSMutableArray,見例如this question

+0

感謝您的鏈接,我可能需要儘快使用它。有用的信息 – leochab 2010-04-28 12:37:24

15

這聽起來像你從哪裏可以限制在集合上強加一個Java/C#類背景的。

集合不會沒有辦法設置對什麼類型的對象可以插入的限制(除非你編寫一個包裝類enfo這個)。 Objective-C在設計上遵循「如果它像鴨子一樣走路,它像鴨子一樣呱呱叫,那麼它最有可能是一隻鴨子」的哲學。也就是說,不是檢查某個對象是否爲特定類型,而應該檢查它是否可以執行您希望的操作,而不管它的類型如何。

您可以使用respondsToSelector:來做到這一點。

最後,你的問題實際上並不涉及數組沒有限制的事實。您的對象似乎沒有聲明實例變量value作爲屬性,或者公開任何訪問器方法。

這就是爲什麼當您嘗試myObject.value時看到錯誤的原因。 Objective-C中的這種語法就是你如何訪問屬性。

Objective-C中實例變量的默認範圍是@protected,這意味着您的類之外的任何內容無需通過某種訪問器方法就無法訪問它們。

您需要聲明並定義方法- (UInt8)value- (void)setValue:(UInt8)aValue並使用它們。

或者,您可以將其聲明爲屬性。

0

子類NSMutableArray並重寫調解對象添加到數組的方法。您將檢查這些重寫方法中的對象類型,如果該類型被接受,則只會調用[super addObject:xyz]

+0

這是一個糟糕的想法。 'NSMutableArray'是一個抽象類,如果不編寫自己的數組實現,就無法真正實現它的子類化。 – 2010-04-28 12:46:01

+1

而不是子類,創建一個包裝。包裝類可以包含一個NSArray的私有實例,並公開一個允許您進行類型檢查的接口。 – Jasarien 2010-04-28 13:19:29

0

也許你可以使用協議:

@protocol Person <NSObject> 
@end 

@interface Person : NSObject <Person> 
@end 

使用:

NSArray<Person>* personArray; 
相關問題