2012-12-06 28 views
-1

這裏的objectAtIndex方法是代碼:A使用的NSArray

TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:(int)^{ 
    if (_segmentNumber < [_segmentArray count]) { 
     return _segmentNumber; 
    } else { 
     return _segmentNumber - 1; 
    } 
}]; 

這裏有什麼問題嗎?在這裏,所有_Variables都是IVAR。我第一次使用塊,有人可以幫助我識別這個問題。它在這裏給出EXC_BAD_INSTRUCTION。

謝謝。

+0

我認爲這是錯誤的'返回_segmentNumber - 1;'假設'segmenNumber'是遠大於陣列數... – Stas

+0

對此事的事實,我知道_segmentNumber能只比陣列數大1。 –

+0

這裏有什麼問題? –

回答

2

試試這個代碼,首先寫塊拿到index號,並使用該號碼從array

int (^segmentIndex)(int) = ^(int segmentNumber){ 
     if (segmentNumber < [_layers count]) { 
      return segmentNumber; 
     } else { 
      return segmentNumber - 1; 
     } 
}; 


NSLog(@"Trail Layer %@", [_layers objectAtIndex:segmentIndex(_segmentNumber)]); 
TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:segmentIndex(_segmentNumber)]; 
+0

它的工作感謝:) 雖然你可以識別我的代碼中的問題?直接使用塊有什麼問題? –

+0

歡迎haris :) – arthankamal

+0

使用塊沒有問題,除了你沒有調用塊。當您應該傳遞塊的返回值時,您將該塊傳遞給該方法。 –

1

塊檢索值是像功能的可運行的東西,基本上是一段代碼,你可以存儲,傳遞,然後運行(或不運行)。你想傳遞一個整數到objectAtIndex:,所以傳遞一個塊絕對沒有任何意義。

什麼你可能意味着需要做的就是運行塊,然後通過其結果objectAtIndex:。在這種情況下,你必須運行塊:

TrailLayer * layer = [_layers objectAtIndex:^{ 
    if (_segmentNumber < [_segmentArray count]) { 
     return _segmentNumber; 
    } else { 
     return _segmentNumber - 1; 
    } 
}()]; // <-- run the block 

然而,定義一個塊(這是一個全面的目標,並做了很多花哨的東西),僅立即運行是有點傻。如果你想只能夠使用一段代碼作爲表達式,你可以使用由GCC和LLVM支持「語句表達」語言的擴展:

TrailLayer * layer = [_layers objectAtIndex:({ 
    int result; 
    if (_segmentNumber < [_segmentArray count]) { 
     result = _segmentNumber; 
    } else { 
     result = _segmentNumber - 1; 
    } 
    result; 
})]; 

不過說真的,你應該只是做一個常規的C在這種情況下的條件表達式:

TrailLayer * layer = [_layers objectAtIndex: 
         _segmentNumber < [_segmentArray count] ? 
         _segmentNumber : _segmentNumber - 1]; 
+0

偉大的答案,但最終我在那個時候結束了三元論的使用,但是因爲我第一次使用Bocks,所以它真的讓我感到困惑,那裏會出現什麼問題。雖然你的觀點絕對正確,但在我的情況下使用塊是愚蠢的。 無論如何,非常感謝,這真的幫助:) –