如何在Swift中的字符串中的特定索引处添加字符

时间:2014-11-24 11:10:56

标签: ios string swift insert

我在Swift中有这样的字符串:

var stringts:String = "3022513240"

如果我想将其更改为字符串,如下所示:"(302)-251-3240",我想在索引0处添加括号,我该怎么做?

在Objective-C中,它以这种方式完成:

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

如何在Swift中完成?

9 个答案:

答案 0 :(得分:71)

Swift 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's answer down below

答案 1 :(得分:26)

如果您将其声明为NSMutableString,则可以这样做,您可以这样做:

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

输出结果为:

(3022513240)

修改

如果您想在开始时添加:

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

如果要在最后一个索引处添加字符:

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

如果您想添加特定索引:

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

答案 2 :(得分:6)

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大于或等于字符串的大小,否则会导致崩溃。

答案 3 :(得分:6)

  

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

答案 4 :(得分:4)

将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
}

答案 5 :(得分:3)

你不能,因为在Swift中,字符串索引(String.Index)是根据Unicode字形集群定义的,因此它可以很好地处理所有的Unicode内容。所以你不能直接从索引构造String.Index。您可以使用advance(theString.startIndex, 3)查看构成字符串的集群并计算与第三个集群对应的索引,但请注意,这是一个O(N)操作。

在您的情况下,使用字符串替换操作可能更容易。

查看this blog post了解详情。

答案 6 :(得分:3)

也许Swift 4的这个扩展程序会有所帮助:

{{1}}

答案 7 :(得分:1)

Dilmurat答案的Swift 4.2版本(已修复代码)

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

请注意,如果索引必须与您要插入(自身)的字符串而不是所提供的字符串相对应。

答案 8 :(得分:0)

简单易行的方法是将 String 转换为 Array 以获得索引的好处,就像这样:

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 时,下次您会感觉一切顺利。

试试看,看看是否有帮助!