如何使用Swift修改String中的单个字符?

时间:2016-01-29 15:39:20

标签: string swift

var str: String = "sometext"

for i in str.characters.indices
{
    str[i] = "c"
}

print(str)

我收到以下错误:
error: cannot assign through subscript: subscript is get-only

2 个答案:

答案 0 :(得分:5)

您收到此错误是因为Swift String的下标方法是get-only,就像它在警告中所说的那样。 这与数组不同。

  • 数组:

    array[0]

    array[0] = 0

  • <强>字符串:

    str[0]

    str[0] = "0"

    str[str.startIndex.advancedBy(0)]

使用replaceRange完成任务。

示例:

var value = "green red blue"

value.replaceRange(value.startIndex.advancedBy(
    6)..<value.startIndex.advancedBy(6 + 3),
    with: "yellow")
print(value)

<强>结果:

green yellow blue

另请参阅Ole Begemann撰写的精彩博客文章,他解释了Swift Strings的工作原理。您还可以找到答案,为什么不能在Swift Strings上使用下标方法。

  

由于存储Swift字符串的方式,String类型不支持通过整数索引随机访问其字符 - 没有直接等效于NSString的characterAtIndex:方法。从概念上讲,String可以看作是双向链接的字符列表而不是数组。   Article Link

答案 1 :(得分:0)

在某些情况下,最好将String转换为Array,mutate,然后转换回String,例如:

var chars = Array("sometext".characters)
for i in 0..<chars.count {
    chars[i] = "c"
}
let string = String(chars)

优点包括:

  1. 清晰度
  2. 在大字符串上获得更好的性能:O(1)在Array中进行每次替换的时间与O(N)时间进行,以便在String中进行每次替换。
  3. 缺点包括:

    1. 内存消耗较高:数组为O(N),String为O(1)。
    2. 选择你的毒药:)