2014-11-08 57 views
0

我有這樣的代碼:防止「stringByReplacingOccurrencesOfString」重寫

NSString *formatted = original; 
formatted = [original stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; 
formatted = [original stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 

正如你可以看到,我想做到以下幾點:

  1. 「+」被替換爲「% 2B」
  2. ‘’替換爲‘+’

當然,這是不工作作爲第二線覆蓋第一升ine,所以現在只有''正被替換爲'+',第一行代碼無效。

有沒有解決這個問題的方法?

+0

只要運行在所述第一輸出端的第二線,而不是「原始」。 – 2014-11-08 13:26:56

+0

@Hotlicks如果你試圖說第二行和第三行代碼周圍,這不起作用,因爲它最終忽略了前一行。我的問題的答案已經足夠。 – iPwnTech 2014-11-08 13:29:31

+0

不,我是說,而不是運行第二行,並在運行第三行時將結果扔掉,使用一行的輸出作爲另一行的輸入。 – 2014-11-08 13:30:39

回答

2
NSString *formatted = original; 
formatted = [formatted stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; 
formatted = [formatted stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 
+0

如果您有任何問題,可以使用新的NSString,以更清晰的方式執行操作:NSString * firstSept = .....,NSString * secondStep = ....,NSString * result = .....? – 2014-11-08 12:19:03

+0

更有效?它使這個和更多的工作,你可以閱讀這個:「NSMutableString類添加一個基本的方法replaceCharactersInRange:withString: - 從基本的字符串處理行爲繼承自NSString。」在Apple文檔中,您可以使用Profile。 – 2014-11-08 12:35:12

-1

最好的方法是使用一個Mutable string對象,而不是一個一成不變的對象作爲每次更換您的字符串它必須在內存中創建一個新的對象,導致不好的編碼實踐。

NSString *original = @"some string here"; 

    /** 
    * Create a Mutable string object as you will always be changing its value depending on the request 
    */ 
    NSMutableString *newString = [NSMutableString stringWithString:original]; 

    /** 
    * replace all occurrences within the current object 
    */ 
    [newString replaceOccurrencesOfString:@"+" 
           withString:@"%2B" 
            options:NSCaseInsensitiveSearch range:NSMakeRange(0, newString.length)]; 

    [newString replaceOccurrencesOfString:@" " 
           withString:@"+" 
            options:NSCaseInsensitiveSearch range:NSMakeRange(0, newString.length)]; 

    NSLog(@"Result: %@", newString); 
+0

實際上使用'NSString'是最佳實踐。 – zaph 2014-11-08 12:25:20

+0

@Zaph真的,你能解釋一下你的理由嗎?這[問題](http://stackoverflow.com/questions/7275097/when-should-we-use-nsstring-and-nsmutablestring)否則說 – 2014-11-08 12:27:55

+0

@ShamsAhmed我相信鏈接問題說'NSMutableString'是更有效的記憶明智的,這裏是一個引用:「我期望MutableString在內存方面會稍微高效一些,因爲您很早就指出程序可能會動態地需要內存.NSString可能會被分配一個適當大小的內存塊。 「_ – iPwnTech 2014-11-08 12:37:25

1

簡單的解決方案:

NSString *original = @"some string+here"; 

NSString *formatted = [original stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; 
formatted = [formatted stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 

NSLog(@"formatted: %@", formatted); 

輸出:

格式化:一些+字符串%2Bhere

+0

感謝您的回答,我現在很困惑與哪種方法一起使用,無論是使用可變對象還是不可變對象。 – iPwnTech 2014-11-08 13:00:29

+1

通常使用不可變的,它更安全。有趣的是,可變的答案是更多的代碼,更多的代碼不是一件好事。最佳做法#1寫出最明顯的代碼,忽略優化。稍後如果有性能問題,那麼配置文件,找到確切的問題並優化。很少的代碼會導致性能問題。 – zaph 2014-11-08 13:08:00

+0

@RAStudios我會讀[早熟優化](http://programmers.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil)然後看看在你的代碼中,看看最適合什麼 – 2014-11-08 13:17:27