2010-07-14 51 views
57

我想問一個關於目標C中的NSString *的問題嗎?我可以檢查NSString *對象的最後一個字符嗎?如何檢查NSString的最後一個字符

例子:

NSString* data = @"abcde,"; 

if(data is end with ',') // I don't know this part 
    // do sth 

非常感謝你。

回答

162
NSString *data = @"abcde,"; 
if([data hasSuffix:@","]) // This returns true in this example 
    // do something 
+0

robinjam,謝謝你的回覆。我嘗試了一下,但沒有奏效。這是另一種方法嗎? – Questions 2010-07-14 10:12:56

+1

它適用於我...您必須在其他地方有一個錯誤。 – robinjam 2010-07-14 10:16:12

+0

robinjam,謝謝你的回覆。我嘗試另一個NSString *,它也可以。我想這是我的程序的一些其他問題。因爲NSString *是從其他對象傳入的,所以我可以顯示NSString的最後一個字符,因爲我想確認最後一個字符。謝謝。 – Questions 2010-07-15 01:07:47

5

NSString Programming Guide建議:

如果你只是想確定一個字符串是否包含給定的模式,你可以使用一個謂語:

所以,在你的榜樣:

NSString *data = @"abcde,"; 

// Create the predicate 
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF endswith %@", @","]; 

// Run the predicate 
// match == YES if the predicate is successful 
BOOL match = [myPredicate evaluateWithObject:data]; 

// Do what you want 
if (match) { 
    // do something 
} 

有點囉嗦寫嗎?也許,但是如果你在多個地方做到這一點,它可以很容易地重構成一個輔助方法。

以下是NSPredicate docs的鏈接。

編輯

我已經做了一些分析,這是矯枉過正在這個簡單的情況下(見下文我的意見)。無論如何,我將把答案留在這裏,只是作爲使用謂詞來處理這類事情的一個例子。

+6

哇!謂詞評估只是爲了檢查字符串的後綴?這有點矯枉過正。 – dreamlax 2010-07-14 14:02:29

+0

爲什麼它是矯枉過正? '-hasSuffix:'只是一個設置NSString搜索的便捷方法。僅僅因爲它寫得更短,並不能提高效率。這也是來自文檔的建議(正如我鏈接到的),它還爲提問者提供了另一個測試他的代碼的方法,因爲'-hasSuffix:'方法不起作用,並且引入了一種新的方法來進行字符串搜索,提問者和其他人可能以前沒有考慮過。 – Abizern 2010-07-14 14:16:44

+1

它是過度的,因爲您必須創建一個謂詞對象,該對象必須解析謂詞格式字符串,並且還必須使用目標對象評估謂詞對象。 'hasSuffix:'只需確保接收者的最後一個字符與參數相等。如果謂詞'endswith'在內部只使用'hasSuffix:',那就不會讓我感到驚訝。另外,在另一個答案中爲'hasSuffix:'提供的代碼有效。如果它不適用於OP,那麼他沒有給我們足夠的信息來正確回答他的問題。 – dreamlax 2010-07-14 14:21:08

4

如果您擔心性能,並且想要檢查一個字符,那麼使用-characterAtIndex:方法可能會更快。 -hasSuffix:接受一個字符串,因此可能需要做更多的工作,而不僅僅是檢查單個字符(儘管差異可能是微不足道的)。

您還可以使用類的方法添加到NSString的是這樣的:

@interface NSString(StringUtilities) 
    - (BOOL) endsWithCharacter: (unichar) c; 
@end 

@implementation NSString(StringUtilities) 

    - (BOOL) endsWithCharacter: (unichar) c 
    { 
     NSUInteger length = [self length]; 
     return (length > 0) && ([self characterAtIndex: length - 1] == c); 
    } 

@end 

// test it... 
NSString *data = @"abcd,"; 
if ([data endsWithCharacter: L',']) 
{ 

} 

你就應該剖析,當然,可以肯定的。請記住,儘管通過將endsWithCharacter放入方法中,我們已經將消息傳遞給它,但這會歪曲分析結果,除非在分析替代方案時執行相同操作。

所有這些在大多數情況下可能是不成熟的優化 - 但是當然,如​​果你每秒鐘做數千次測試,這可能很重要(在這種情況下,你可能想直接在循環中使用代碼,因爲消息在嚴密的內部循環中傳遞並不是一個很好的計劃)。

+0

' - [NSString characterAtIndex:]'返回一個'unichar',而不是'char'。 – 2010-07-16 11:40:46

+0

好點喬納森 - 我已經更新了相應的例子... – 2010-07-16 16:50:11

相關問題