2013-07-19 66 views
0

我嘗試了一些組合,但似乎找不到正確的答案。我期待將第2行和第3行合併爲一行代碼。代碼優化(將2行代碼合併到1中)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'SSM M51 Copperhead'"]; 
NSArray *searchResults1 = [self.weaponsArray filteredArrayUsingPredicate:predicate]; 
weapons = [searchResults1 objectAtIndex:0]; 
if(weapons.range > SSMrange) 
    SSMrange = weapons.range; 

('武器'是一類)。

+5

爲什麼?你期望獲得什麼? (並不是說這很難做到。)「菊花鏈式」訪問級別使代碼更難以調試,難以理解,並且不會提高性能。 –

+0

尋找切出一些代碼。我現在正在開發的項目中有很多這樣的項目,並且正在尋找更好的方法來編寫代碼。 – sangony

+2

它的寫法是更好的方法。綜合這一切並不是更好的方法。請記住:少線!=更好的代碼。 – rmaddy

回答

2
weapons = [self.weaponsArray filteredArrayUsingPredicate:predicate][0]; 

雖然這不會讓你的代碼更快。

+0

我知道,但我一直在尋找簡單的代碼,只要我可以。 – sangony

+0

爲了便於閱讀,也可以使用'[[self.weaponsArray filteredArrayUsingPredicate:predicate] objectAtIndex:0]'。 –

+0

請記住,將原始代碼更改爲新代碼會使其更難以閱讀並且難以調試。考慮需要檢查謂詞的結果。 – rmaddy

2

如何定義等的方法:

- (Weapon*)firstWeaponMatchingPredicateWithFormat:(NSString*)format 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:format]; 
    NSArray *searchResults1 = [self.weaponsArray filteredArrayUsingPredicate:predicate]; 
    return (searchResults1.count > 0 ? [searchResults1 objectAtIndex:0] : nil); 
} 

調用具有:

Weapon *weapon = [self firstWeaponMatchingPredicateWithFormat:@"name == 'SSM M51 Copperhead'"]; 
+0

謝謝@Taum。猜猜我在森林裏太深了,看不到樹。你的例子更有意義。不得不爲hypercrypt給出正確的答案,因爲他確實回答了我先前提出的問題。 – sangony

1
weapon = [[self.weaponsArray filteredArrayUsingPredicate:predicate] objectAtIndex:0]; 
1

沒有必要創建一個具有過濾的結果數組對象只拿到第一個對象並扔掉收藏品。

如果您的目標是iOS 4.0或更高版本,NSArray提供的功能是獲取通過塊通過測試的第一個對象的索引。

NSUInteger indexOfObject = [self.weaponsArray indexOfObjectPassingTest:^(id obj, NSUInteger index, BOOL *stop) { 
    return [[obj valueForKey:@"name"] isEqualToString:@"SSM M51 Copperhead"]; 
}]; 

該塊將一次爲每個對象被執行,並且該陣列將停止處理時,塊11返回YES。一旦知道了該對象的索引,就可以直接從您的self.weaponsArray數組中獲取該值。只要確保您檢查NSNotFound的返回值。

我試着過濾一個包含1,000,000個對象的數組,並使用這兩種方法搜索第一個和最後一個對象。即使在查找最後一個對象時,塊方法仍比使用謂詞更快。我猜是因爲沒有創建過濾數組的保存。