web-dev-qa-db-fra.com

Tout moyen de remplacer les caractères sur Swift String?

Je cherche un moyen de remplacer des caractères dans un Swift String.

Exemple: "This is my string"

Je voudrais remplacer par + pour obtenir: "This+is+my+string".

Comment puis-je atteindre cet objectif?

430
user3332801

Cette réponse a été mise à jour pour Swift 4. Si vous utilisez toujours Swift 1, 2 ou 3, reportez-vous à l'historique des révisions.

Vous avez plusieurs options. Vous pouvez faire comme suggéré par @jaumard et utiliser replacingOccurrences()

let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)

Et comme noté par @cprcrack ci-dessous, les paramètres options et range sont facultatifs. Par conséquent, si vous ne souhaitez pas spécifier d'options de comparaison de chaînes ou une plage dans laquelle le remplacement doit être effectué, vous devez uniquement: .

let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+")

Ou, si les données sont dans un format spécifique comme celui-ci, où vous ne remplacez que des caractères de séparation, vous pouvez utiliser components() pour scinder la chaîne en un tableau, puis vous pouvez utiliser la fonction join(). pour les remettre avec un séparateur spécifié.

let toArray = aString.components(separatedBy: " ")
let backToString = toArray.joined(separator: "+")

Ou si vous recherchez une solution plus Swifty qui n’utilise pas l’API de NSString, vous pouvez l’utiliser.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})
834
Mick MacCallum

Vous pouvez utiliser ceci:

let s = "This is my string"
let modified = s.replace(" ", withString:"+")    

Si vous ajoutez cette méthode d'extension n'importe où dans votre code:

extension String
{
    func replace(target: String, withString: String) -> String
    {
       return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil)
    }
}

Swift 3:

extension String
{
    func replace(target: String, withString: String) -> String
    {
        return self.replacingOccurrences(of: target, with: withString, options: NSString.CompareOptions.literal, range: nil)
    }
}
62
whitneyland

Swift 3, Swift 4, Swift 5 Solution

let exampleString = "Example string"

//Solution suggested above in Swift 3.0
let stringToArray = exampleString.components(separatedBy: " ")
let stringFromArray = stringToArray.joined(separator: "+")

//Swiftiest solution
let swiftyString = exampleString.replacingOccurrences(of: " ", with: "+")
49
Ben Sullivan

Avez-vous testé ceci:

var test = "This is my string"

let replaced = test.stringByReplacingOccurrencesOfString(" ", withString: "+", options: nil, range: nil)
18
jaumard

Swift 4:

let abc = "Hello world"

let result = abc.replacingOccurrences(of: " ", with: "_", 
    options: NSString.CompareOptions.literal, range:nil)

print(result :\(result))

Sortie:

result : Hello_world
13
Garine

J'utilise cette extension:

extension String {

    func replaceCharacters(characters: String, toSeparator: String) -> String {
        let characterSet = NSCharacterSet(charactersInString: characters)
        let components = self.componentsSeparatedByCharactersInSet(characterSet)
        let result = components.joinWithSeparator("")
        return result
    }

    func wipeCharacters(characters: String) -> String {
        return self.replaceCharacters(characters, toSeparator: "")
    }
}

Usage:

let token = "<34353 43434>"
token.replaceCharacters("< >", toString:"+")
8
Ramis

Une solution Swift 3 dans le sens de Sunkas:

extension String {
    mutating func replace(_ originalString:String, with newString:String) {
        self = self.replacingOccurrences(of: originalString, with: newString)
    }
}

Utilisation:

var string = "foo!"
string.replace("!", with: "?")
print(string)

Sortie:

foo?
8
Josh Adams

Une catégorie qui modifie une chaîne mutable existante:

extension String
{
    mutating func replace(originalString:String, withString newString:String)
    {
        let replacedString = self.stringByReplacingOccurrencesOfString(originalString, withString: newString, options: nil, range: nil)
        self = replacedString
    }
}

Utilisation:

name.replace(" ", withString: "+")
6
Sunkas

Solution Swift 3 basée sur réponse de Ramis :

extension String {
    func withReplacedCharacters(_ characters: String, by separator: String) -> String {
        let characterSet = CharacterSet(charactersIn: characters)
        return components(separatedBy: characterSet).joined(separator: separator)
    }
}

J'ai essayé de trouver un nom de fonction approprié selon la convention de nommage Swift 3.

4
SoftDesigner

C'est facile dans Swift 4.2. il suffit d'utiliser replacingOccurrences(of: " ", with: "_") pour le remplacer

var myStr = "This is my string"
let replaced = myStr.replacingOccurrences(of: " ", with: "_")
print(replaced)
1
Tariqul

Voici l'exemple pour Swift 3:

var stringToReplace = "This my string"
if let range = stringToReplace.range(of: "my") {
   stringToReplace?.replaceSubrange(range, with: "your")
} 
1
Övünç Metin

extension rapide:

extension String {

    func stringByReplacing(replaceStrings set: [String], with: String) -> String {
        var stringObject = self
        for string in set {
            stringObject = self.stringByReplacingOccurrencesOfString(string, withString: with)
        }
        return stringObject
    }

}

Continuez et utilisez-le comme let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

La vitesse de la fonction est quelque chose dont je peux difficilement être fier, mais vous pouvez passer un tableau de String en un seul passage pour effectuer plusieurs remplacements.

0
Juan Boero

Moins arrivé à moi, je veux juste changer (un mot ou un caractère) dans le String

J'ai donc utilisé la Dictionary

  extension String{
    func replaceDictionary(_ dictionary: [String: String]) -> String{
          var result = String()
          var i = -1
          for (of , with): (String, String)in dictionary{
              i += 1
              if i<1{
                  result = self.replacingOccurrences(of: of, with: with)
              }else{
                  result = result.replacingOccurrences(of: of, with: with)
              }
          }
        return result
     }
    }

usage

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replaceDictionary(dictionary)
print(mobileResult) // 001800444999
0
amin

Je pense que Regex est le moyen le plus flexible et le plus solide:

var str = "This is my string"
let regex = try! NSRegularExpression(pattern: " ", options: [])
let output = regex.stringByReplacingMatchesInString(
    str,
    options: [],
    range: NSRange(location: 0, length: str.characters.count),
    withTemplate: "+"
)
// output: "This+is+my+string"
0
duan

J'ai implémenté cette fonction très facile:

func convap (text : String) -> String {
    return text.stringByReplacingOccurrencesOfString("'", withString: "''")
}

Pour que vous puissiez écrire:

let sqlQuery = "INSERT INTO myTable (Field1, Field2) VALUES ('\(convap(value1))','\(convap(value2)')
0
Blasco73

Si vous ne souhaitez pas utiliser les méthodes Objective-C NSString, vous pouvez simplement utiliser split et join:

var string = "This is my string"
string = join("+", split(string, isSeparator: { $0 == " " }))

split(string, isSeparator: { $0 == " " }) renvoie un tableau de chaînes (["This", "is", "my", "string"]).

join joint ces éléments à un +, ce qui donne le résultat souhaité: "This+is+my+string".

0
Aaron Brager