web-dev-qa-db-fra.com

Comment ajouter un caractère à un index particulier dans une chaîne dans Swift

J'ai une chaîne comme celle-ci dans Swift:

var stringts:String = "3022513240"

Si je veux le changer en chaîne en quelque chose comme ceci: "(302)-251-3240", je veux ajouter les partheses à l'index 0, comment puis-je le faire?

En Objective-C, cela se fait de la manière suivante:

 NSMutableString *stringts = "3022513240";
 [stringts insertString:@"(" atIndex:0];

Comment le faire à Swift?

42
lakesh

Si vous le déclarez comme NSMutableString alors c'est possible et vous pouvez le faire de cette façon:

let str: NSMutableString = "3022513240)"
str.insert("(", at: 0)
print(str)

La sortie est:

(3022513240)

EDIT:

Si vous voulez ajouter au début:

var str = "3022513240)"
str.insert("(", at: str.startIndex)

Si vous voulez ajouter un caractère au dernier index:

str.insert("(", at: str.endIndex)

Et si vous voulez ajouter à un index spécifique:

str.insert("(", at: str.index(str.startIndex, offsetBy: 2))
30
Dharmesh

Swift 3

Utilisez l’approche native Swift:

var welcome = "hello"

welcome.insert("!", at: welcome.endIndex) // prints hello!
welcome.insert("!", at: welcome.startIndex) // prints !hello
welcome.insert("!", at: welcome.index(before: welcome.endIndex)) // prints hell!o
welcome.insert("!", at: welcome.index(after: welcome.startIndex)) // prints h!Ello
welcome.insert("!", at: welcome.index(welcome.startIndex, offsetBy: 3)) // prints hel!lo

Si vous souhaitez en savoir plus sur les chaînes et les performances, regardez @ Thomas Deniau's answer en bas .

71
Dan Beaulieu

var phone = "+9945555555"

var indx = phone.index (phone.startIndex, offsetBy: 4)

phone.insert ("-", at: indx)

index = phone.index (phone.startIndex, offsetBy: 7)

phone.insert ("-", at: indx)

// + 994-55-55555

6
ElvinM
var myString = "hell"
let index = 4
let character = "o" as Character

myString.insert(
    character, at:
    myString.index(myString.startIndex, offsetBy: index)
)

print(myString) // "hello"

Attention: assurez-vous que index est supérieur ou égal à la taille de la chaîne, sinon vous aurez un crash.

6
Eric

Pour afficher un numéro de téléphone à 10 chiffres au format USA Number (###) ### - ####Swift

func arrangeUSFormat(strPhone : String)-> String {
    var strUpdated = strPhone
    if strPhone.characters.count == 10 {
        strUpdated.insert("(", at: strUpdated.startIndex)
        strUpdated.insert(")", at: strUpdated.index(strUpdated.startIndex, offsetBy: 4))
        strUpdated.insert(" ", at: strUpdated.index(strUpdated.startIndex, offsetBy: 5))
        strUpdated.insert("-", at: strUpdated.index(strUpdated.startIndex, offsetBy: 9))
    }
    return strUpdated
}
4
Maninderjit Singh

Peut-être que cette extension pour Swift 4 aidera:

extension String {
  mutating func insert(string:String,ind:Int) {
    self.insert(contentsOf: string, at:self.index(self.startIndex, offsetBy: ind) )
  }
}
4

Vous ne pouvez pas, car Swift index de chaîne (String.Index) est défini en termes de grappes de graphèmes Unicode, de sorte qu'il gère correctement tous les éléments Unicode. Vous ne pouvez donc pas créer de chaîne. Index directement à partir d'un index. Vous pouvez utiliser advance(theString.startIndex, 3) pour examiner les clusters constituant la chaîne et calculer l'index correspondant au troisième cluster, mais attention, il s'agit d'un O(N) opération.

Dans votre cas, il est probablement plus facile d'utiliser une opération de remplacement de chaîne.

Départ cet article de blog pour plus de détails.

3
Thomas Deniau

Vous ne pouvez pas utiliser ci-dessous Swift 2.0 car String cessa d'être un collection dans Swift 2.0. Mais dans = Swift 3/4 n'est plus nécessaire maintenant que String est à nouveau un Collection. Utilisez l'approche native de String, Collection.

var stringts:String = "3022513240"
let indexItem = stringts.index(stringts.endIndex, offsetBy: 0)
stringts.insert("0", at: indexItem)
print(stringts) // 30225132400
2
Pranavan Sp

Version Swift 4.2 de la réponse de Dilmurat (avec corrections de code)

extension String {
    mutating func insert(string:String,ind:Int) {
        self.insert(contentsOf: string, at:self.index(self.startIndex, offsetBy: ind) )
    }
}

Remarquez si vous voulez que l'index doit être par rapport à la chaîne dans laquelle vous insérez (self) et non à la chaîne que vous fournissez.

1
Dilapidus