web-dev-qa-db-fra.com

Comment remplacer le nième caractère d'une chaîne par un autre

Comment pourrais-je remplacer nth le caractère de String par un autre?

func replace(myString:String, index:Int, newCharac:Character) -> String {
    // Write correct code here
    return modifiedString
}

Par exemple, replace("House", 2, "r") devrait être égal à "Horse".

19
Piercy

S'il vous plaît voir la réponse de NateCook pour plus de détails

func replace(myString: String, _ index: Int, _ newChar: Character) -> String {
    var chars = Array(myString.characters)     // gets an array of characters
    chars[index] = newChar
    let modifiedString = String(chars)
    return modifiedString
}

replace("House", 2, "r")

Ceci n'est plus valide et obsolète.

Vous pouvez toujours utiliser Swift String avec NSString.Vous pouvez donc appeler la fonction NSString sur Swift String. Avec l'ancien stringByReplacingCharactersInRange:, vous pouvez le faire

var st :String = "House"
let abc = st.bridgeToObjectiveC().stringByReplacingCharactersInRange(NSMakeRange(2,1), withString:"r") //Will give Horse
1
codester

Les solutions qui utilisent des méthodes NSString échoueront pour toutes les chaînes contenant des caractères Unicode multi-octets. Voici deux manières natives de Swift d’aborder le problème:

Vous pouvez utiliser le fait qu'une String est une séquence de Character pour convertir la chaîne en un tableau, la modifier et reconvertir le tableau:

func replace(myString: String, _ index: Int, _ newChar: Character) -> String {
    var chars = Array(myString)     // gets an array of characters
    chars[index] = newChar
    let modifiedString = String(chars)
    return modifiedString
}

replace("House", 2, "r")
// Horse

Alternativement, vous pouvez parcourir la chaîne vous-même:

func replace(myString: String, _ index: Int, _ newChar: Character) -> String {
    var modifiedString = String()
    for (i, char) in myString.characters.enumerate() {
        modifiedString += String((i == index) ? newChar : char)
    }
    return modifiedString
}

Dans la mesure où ceux-ci restent entièrement dans Swift, ils sont tous deux compatibles avec Unicode:

replace("????????????????????", 2, "????")
// ????????????????????
27
Nate Cook

Dans Swift 4 c'est beaucoup plus facile. 

let newString = oldString.prefix(n) + char + oldString.dropFirst(n + 1)

Ceci est un exemple:

let oldString = "Hello, playground"
let newString = oldString.prefix(4) + "0" + oldString.dropFirst(5)

où le résultat est

Hell0, playground

Le type de newString est Substring. prefix et dropFirst return Substring. La sous-chaîne est une tranche de chaîne. En d'autres termes, les sous-chaînes sont rapides car il n'est pas nécessaire d'allouer de la mémoire pour le contenu de la chaîne, mais le même espace de stockage que la chaîne d'origine est utilisé.

10
Luca Torella

J'ai trouvé cette solution.

var string = "Cars"
let index = string.index(string.startIndex, offsetBy: 2)
string.replaceSubrange(index...index, with: "t")
print(string)
// Cats
9
Igor Kulagin

J'ai développé la réponse de Nate Cook et l'ai transformée en une extension de chaîne.

extension String {

    //Enables replacement of the character at a specified position within a string
    func replace(_ index: Int, _ newChar: Character) -> String {
        var chars = Array(characters)
        chars[index] = newChar
        let modifiedString = String(chars)
        return modifiedString
    }
}

usage:

let source = "House"
let result = source.replace(2,"r")

le résultat est "Cheval"

1
Greg

Après avoir examiné les documents Swift, j'ai réussi à créer cette fonction:

//Main function
func replace(myString:String, index:Int, newCharac:Character) -> String {
    //Looping through the characters in myString
    var i = 0
    for character in myString {
        //Checking to see if the index of the character is the one we're looking for
        if i == index {
            //Found it! Now instead of adding it, add newCharac!
            modifiedString += newCharac
        } else {
            modifiedString += character
        }
        i = i + 1
    }
    // Write correct code here
    return modifiedString
}

S'il vous plaît noter que cela n'a pas été testé, mais cela devrait vous donner la bonne idée.

0
Joshcamas
func replace(myString:String, index:Int, newCharac:Character) -> String {

    var modifiedString = myString
    let range = Range<String.Index>(
        start: advance(myString.startIndex, index),
        end: advance(myString.startIndex, index + 1))
    modifiedString.replaceRange(range, with: "\(newCharac)")
    return modifiedString
}

Je préférerais cependant passer une String à une Character.

0
Rivera

Je pense que ce que @Greg essayait de réaliser avec son extension était le suivant:

mutating func replace(characterAt index: Int, with newChar: Character) {
    var chars = Array(characters)
    if index >= 0 && index < self.characters.count {
        chars[index] = newChar
        let modifiedString = String(chars)
        self = modifiedString
    } else {
        print("can't replace character, its' index out of range!")
    }
}

usage:

let source = "House"
source.replace(characterAt: 2, with: "r") //gives you "Horse"
0
Yurii Koval

Voici un moyen de remplacer un seul personnage:

var string = "This is the original string."
let offset = 27
let index = string.index(string.startIndex, offsetBy: offset)
let range = index...index
print("ORIGINAL string: " + string)
string.replaceSubrange(range, with: "!")
print("UPDATED  string: " + string)

// ORIGINAL string: This is the original string.
// UPDATED  string: This is the original string!

Cela fonctionne aussi avec les chaînes multi-caractères:

var string = "This is the original string."
let offset = 7
let index = string.index(string.startIndex, offsetBy: offset)
let range = index...index
print("ORIGINAL string: " + string)
string.replaceSubrange(range, with: " NOT ")
print("UPDATED  string: " + string)

// ORIGINAL string: This is the original string.
// UPDATED  string: This is NOT the original string.
0
Kwan McComas