2016-01-29 51 views
1
var str: String = "sometext" 

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

print(str) 

,我發現了以下錯誤:
error: cannot assign through subscript: subscript is get-only如何使用Swift修改字符串中的單個字符?

+0

你想只用'C'的字符串結束了? – Eendje

+0

@Eendje它只是爲了示範,但在這種情況下,是的。 –

回答

5

您收到此錯誤,因爲斯威夫特字符串的下標方法得到,只喜歡它在你的警告說。 這與Array不同。

  • 陣列:

    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 

也可以看看從奧萊Begemann這一高超的博客文章誰解釋斯威夫特字符串是如何工作的很詳細。你也會找到答案爲什麼你不能在Swift字符串上使用下標方法。

Because of the way Swift strings are stored, the String type does not support random access to its Characters via an integer index — there is no direct equivalent to NSStringʼs characterAtIndex: method. Conceptually, a String can be seen as a doubly linked list of characters rather than an array. Article Link

+0

謝謝你,很好的回答! –

0

在一些情況下,可能優選的是將字符串轉換爲一個陣列,變異,然後轉換回爲String,例如:

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

優點包括:

  1. 清晰度
  2. 大字符串的更好性能:O(1)用於在數組中創建每個替換的時間與用於在字符串中進行每個替換的O(N)時間。

缺點包括:

  1. 更高的內存消耗:O(N)爲陣列VS O(1)爲字符串。

挑選你的毒藥:)