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"
.
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
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, "????")
// ????????????????????
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é.
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
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"
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.
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
.
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"
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.