2014-10-16 18 views
9

in Objective-C che ho usato:Come trovo l'ultima occorrenza di una sottostringa in una stringa Swift?

[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch]; 

Ma ora NSBackWardsSearch sembra non esistere. Qualcuno potrebbe fornire un codice equivalente per Swift?

Vorrei essere in grado di trovare il numero di carattere nell'intera stringa, se possibile. Quindi nell'esempio sopra ritornerebbe 3.

risposta

14

Gli schemi di cacao dovrebbero essere accessibili in Swift, ma è necessario importarli. Prova a importare Foundation per accedere all'API NSString. Da "Working with Cocoa Data Types–Strings" della "Utilizzo rapido con cacao e Objective-C" guida:

Swift colma automaticamente tra il tipo String e la classe NSString. [...] Per abilitare il bridging di stringhe, è sufficiente importare Foundation.

Inoltre, NSBackwardsSearch è un valore di enumerazione (contrassegnato & importati come option), quindi bisogna usare la sintassi enum/opzione di Swift per accedervi (come parte del tipo NSStringCompareOptions opzione). I prefissi vengono rimossi dai valori C enumeration, quindi rilasciare NS dal nome del valore.

Presi tutti insieme, abbiamo:

import Foundation 
"abc def ghi abc def ghi".rangeOfString("c", options:NSStringCompareOptions.BackwardsSearch) 

Si noti che potrebbe essere necessario utilizzare le distance and advance funzioni per rendere correttamente l'uso del campo da rangeOfString.

12

Swift 3.0:

"abc def ghi abc def ghi".range(of: "c", options: String.CompareOptions.backwards, range: nil, locale: nil) 
5

E se si desidera sostituire l'ultima sottostringa in una stringa:

(Swift 3)

extension String 
{ 
    func replacingLastOccurrenceOfString(_ searchString: String, 
      with replacementString: String, 
      caseInsensitive: Bool = true) -> String 
    { 
     let options: String.CompareOptions 
     if caseInsensitive { 
      options = [.backwards, .caseInsensitive] 
     } else { 
      options = [.backwards] 
     } 

     if let range = self.range(of: searchString, 
       options: options, 
       range: nil, 
       locale: nil) { 

      return self.replacingCharacters(in: range, with: replacementString) 
     } 
     return self 
    } 
} 

Usage:

let alphabet = "abc def ghi abc def ghi" 
let result = alphabet.replacingLastOccurrenceOfString("ghi", 
     with: "foo") 

print(result) 

// "abc def ghi abc def foo" 

Oppure, se si desidera rimuovere completamente l'ultima sottostringa e pulirla:

let result = alphabet.replacingLastOccurrenceOfString("ghi", 
      with: "").trimmingCharacters(in: .whitespaces) 

print(result) 

// "abc def ghi abc def" 
Problemi correlati