2017-03-14 32 views
-1

像C,我們可以簡單地做在Swift中,如何使用下標修改字符串中的字符?

str[i] = str[j] 

但如何寫在迅速的類似的邏輯? 這裏是我的代碼,但得到的錯誤: 無法通過下標分配:下標是讓只

let indexI = targetString.index(targetString.startIndex, offsetBy: i) 
let indexJ = targetString.index(targetString.startIndex, offsetBy: j)   
targetString[indexI] = targetString[indexJ] 

我知道這可能通過使用這種方法會奏效,但它太不方便

replaceSubrange(, with:) 
+1

您通過證明下標是隻讀來回答自己的問題。 – creeperspeak

+0

我不明白爲什麼不應該設置下標 - 它在功能上與'.replaceSubrange(indexI ... indexI,具有:CollectionOfOne(targetString [indexJ]))'相同。你可以隨時[提交錯誤/改進](https://bugs.swift.org)。 – Hamish

+0

選擇這個:http://stackoverflow.com/questions/24092884/get-nth-character-of-a-string-in-swift-programming-language – agscastaneda

回答

1

在C語言中,字符串(char *)可以被視爲字符數組。在Swift中,您可以將String轉換爲[Character],執行所需的修改,然後將[Character]轉換回String

例如:

let str = "hello"  
var strchars = Array(str.characters)  
strchars[0] = strchars[4]  
let str2 = String(strchars) 
print(str2) // "oello" 

這似乎想了很多工作,爲一個單獨的修改,但如果你是這樣的移動人物衆多,你只需要一次,每個方向轉換。


逆向字符串

下面是一個簡單的算法以逆轉串的例子。通過首先轉換爲一個字符數組,該算法與您在C中執行的方式類似:

let str = "abcdefg" 
var strchars = Array(str.characters) 

var start = 0 
var end = strchars.count - 1 

while start < end { 
    let temp = strchars[start] 
    strchars[start] = strchars[end] 
    strchars[end] = temp 
    start += 1 
    end -= 1 
} 

let str2 = String(strchars) 
print(str2) // "gfedcba" 
+0

謝謝!這是我期待的那種解決方案。通過這種方式,我們可以專注於邏輯本身,而不是苦於語法。 –

0

處理與String與斯威夫特是a **的主要痛苦。與大多數語言不同,我知道將字符串視爲字符數組,Swift將字符串視爲集合擴展字形羣集,並且訪問它們的API非常笨拙。 Changes are coming in Swift 4但宣言失去了我大約10段落

回到你的問題......你可以替換這樣的字符:

var targetString = "Hello world" 
let i = 0 
let j = 1 

let indexI = targetString.index(targetString.startIndex, offsetBy: i) 
let indexJ = targetString.index(targetString.startIndex, offsetBy: j) 

targetString.replaceSubrange(indexI...indexI, with: targetString[indexJ...indexJ]) 

print(targetString) // eello world 
+0

感謝您的解釋。我希望有一些類似於C的方式,這就是爲什麼選擇另一個答案,但你的答案也是有幫助的。 –