Как добавить символ по определенному индексу в строку в Swift

У меня есть такая строка в Swift:

var stringts:String = "3022513240"

Если я хочу изменить его на строку что-то вроде этого: "(302)-251-3240"Я хочу добавить партезы в индекс 0, как мне это сделать?

В Objective-C это делается так:

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

Как это сделать в Swift?

11 ответов

Решение

Если вы объявляете это как NSMutableString тогда это возможно, и вы можете сделать это следующим образом:

var str : NSMutableString = "3022513240)"
    str.insertString("(", atIndex: 0)
    print(str)

Выход:

(3022513240)

Свифт 3

Используйте нативный подход 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

Если вы заинтересованы в получении дополнительной информации о строках и производительности, взгляните на Thomas Deniau ниже.

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

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

print(myString) // "hello"

Осторожно: убедитесь, что index больше или равен размеру строки, иначе вы получите сбой.

Может быть, это расширение для Swift 4 поможет:

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

Для отображения 10-значного номера телефона в формате номера США (###) ### - #### SWIFT 3

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
}

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

Вы не можете, потому что в Swift строковые индексы (String.Index) определены в терминах кластеров графических графических объектов Unicode, так что он хорошо обрабатывает все элементы Unicode. Таким образом, вы не можете создать String.Index из индекса напрямую. Ты можешь использовать advance(theString.startIndex, 3) посмотреть на кластеры, составляющие строку, и вычислить индекс, соответствующий третьему кластеру, но будьте осторожны, это операция O(N).

В вашем случае, вероятно, проще использовать операцию замены строки.

Проверьте это сообщение в блоге для более подробной информации.

Версия ответа Дильмурата Swift 4.2 (с исправлениями кода)

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

Обратите внимание, что если хотите, индекс должен соответствовать строке, которую вы вставляете (self), а не строке, которую вы предоставляете.

Вы не можете использовать ниже Swift 2.0, потому что String перестал быть collection в Swift 2.0. но в Swift 3 / 4 больше не нужно теперь, когда String это Collection снова. Используйте нативный подход String,Collection,

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

Простой и легкий способ - преобразовать в, чтобы получить преимущества индекса вот так:

      let input = Array(str)

Если вы попытаетесь проиндексировать в String без использования какого-либо преобразования.

Вот полный код расширения:

      extension String {
    subscript (_ index: Int) -> String {
    
        get {
             String(self[self.index(startIndex, offsetBy: index)])
        }
    
        set {
            if index >= count {
                insert(Character(newValue), at: self.index(self.startIndex, offsetBy: count))
            } else {
                insert(Character(newValue), at: self.index(self.startIndex, offsetBy: index))
            }
        }
    }
}

Теперь, когда вы можете читать и записывать один символ из строки, используя его индекс, как вы изначально хотели:

      var str = "car"
str[3] = "d"
print(str)

Это простой и полезный способ использовать его и пройти через модель доступа Swift String. Теперь, когда вы почувствуете, что в следующий раз все идет гладко, когда вы можете перебрать струну так, как она есть, а не забрасывать ее в Array.

Попробуйте и посмотрите, поможет ли это!

  • вот мой ответ. - как добавить одну строку в другую строку - по любому заданному индексу - используя цикл for и суффикс префикса -
      let a  = "manchester"
let b = "hello"

var c = ""

c = "\(a.prefix(a.description.count/2)) \(b) \(a.suffix(a.description.count/2))"
        
        print(c)

output - 
manch hello ester

    

Другие вопросы по тегам