快速計數
回答
爲什麼要這麼做?我認爲這會造成越野車和意外行爲。如果陣列中填充了不同的元素,而不是使用:
for (id object in myArray) {
// Check what kind of class it is
if ([object isKindOfClass:[UIView class]]) {
// Do something
}
else {
// Handle accordingly
}
}
你在做什麼在你的例子是有效的一樣,
for (id object in myArray) {
NSString *string = (NSString *)object;
NSLog(@"%@\n", string);
}
僅僅因爲你投object
作爲(NSString *)
不意思是string
實際上將指向NSString
對象。以這種方式調用NSLog()
將根據NSObject protocol調用- (NSString *)description
方法,其中在數組內引用的類可能符合或不符合。如果它符合,它會打印。否則,它會崩潰。
有趣的問題。爲快速列舉最通用的語法是
for (NSObject *obj in myArray)
NSLog(@"%@\n", obj);
我相信,通過做
for (NSString *string in myArray)
NSLog(@"%@\n", string);
相反,你只是鑄造每個對象爲NSString
。也就是說,我認爲上述等同於
for (NSObject *obj in myArray) {
NSString *string = obj;
NSLog(@"%@\n", string);
}
我找不到在蘋果的documentation for Fast Enumeration的這種精確提,但你可以檢查它的例子,看看會發生什麼。
不是「最通用」版本是「for(id obj in arr)」(因爲覆蓋了(微小的數字)不從'NSObject'下降的對象)? –
我只是試過一個簡單的例子...這是我的代碼。
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];
NSNumber *number = [NSNumber numberWithInteger:6];
[array addObject:number];
[array addObject:@"Second"];
現在,如果我只是登錄對象,沒有問題。 NSNumber
實例正在鑄造爲NSString
,但兩種方法都響應-description
,所以它不是問題。
for (NSString *string in array)
{
NSLog(@"%@", string);
}
但是,如果我嘗試登錄NSString
-length
...
for (NSString *string in array)
{
NSLog(@"%i", string.length);
}
...它拋出一個NSInvalidArgumentException
因爲NSNumber
不向-length
選擇作出迴應。長話短說,Objective-C給你很多繩索。不要把它掛在上面。
NSNumber不作爲NSString被轉換。 NSNumber和NSString都是NSObject的後代,NSLog就像你說的那樣調用'description'。但沒有涉及任何投射。 – 2011-12-09 23:33:47
哦,我明白了。我想我只是混淆了鑄造和代碼完成功能。在我寫這個例子的時候,我沒有收到關於'NSNumber'實例的消息'-length'的警告。 –
啊!好的...我現在也明白你的意思了。 NSNumber被作爲一個NSString轉換爲'string'。我以爲你是在說NSLog正在做鑄造(從提及'description')。我的錯! – 2011-12-09 23:56:58
你要明白,在OBJ-C的指針沒有類型信息。即使您編寫NSString*
,也只是一個編譯檢查。在運行期間,一切都只是一個id
。
Obj-c運行時從不檢查對象是否是給定的類。您可以將NSNumbers放入NSString指針中而不會出現問題。只有當您嘗試調用未在對象上定義的方法(發送消息)時纔會出現錯誤。
快速枚舉如何工作?它完全一樣:
for (NSUInteger i = 0; i < myArray.count; i++) {
NSString* string = [myArray objectAtIndex:i];
[...]
}
這只是因爲它在較低的水平上運行更快。
由於所有的NSObject對isKindOfClass迴應,你仍然可以鑄造保持在最低限度:在類
for(NSString *string in myArray) {
if (![string isKindOfClass:[NSString class]])
continue;
// proceed, knowing you have a valid NSString *
// ...
}
- 1. Powershell:快速計數容器
- 2. 快速linq計數問題
- 3. 快速高效的數組計算
- 4. Windows上的快速計數信號量?
- 5. 需要快速計算數據
- 6. 快速排序比較計數
- 7. 節點快速會話計數
- 8. 快速n-gram計算
- 9. HBase的快速計算行
- 10. SQL 2005 - 快速複製數據庫+數據的快速方法
- 11. 快速比較數組數
- 12. 快速處理計算器並卡住
- 13. 快速計算圖像(或矩陣)
- 14. 快速結賬訂單總計丟失
- 15. 快速的bignum平方計算
- 16. 通過快速計算midnights的天差
- 17. 快速計算總距離iOS
- 18. 快速哈密頓週期計算
- 19. 從ViewController快速通話計時器
- 20. 快速計算卷積的方法
- 21. jquery/javascript如何快速計算寬度
- 22. 計算快速排序比較
- 23. 快速核心矩陣計算python
- 24. 快速計算R中的Tomek鏈接
- 25. 快速排序的複雜性計算
- 26. JSF 2.0快速網頁設計工具
- 27. 計算快速傅立葉變換時..?
- 28. 契約式設計和快速失敗
- 29. 使用jQuery快速滾動倒計時
- 30. Silverlight 4/VS2010中的快速UI設計
快速列舉「需要你的話。」 @awfullyjohn提供了處理具有未知類成員的數組的最佳解決方案。沒有隱式的過濾發生,並可能導致調用接收器無法處理的方法...崩潰 –