2014-11-05 44 views
3

我試圖通過更改每個單獨的字符來更改字符串。在swift中使用ascii值更改字符的值

現在我正在做的是一次讀取字符串中的一個字符,嘗試將其轉換爲ascii,並將值加1。我有以下代碼。

var phrase = textfield1.text 
    var i = 0 
    for character in phrase 
    { 
     var s = String(character).unicodeScalars 
     s[s.startIndex].value 
     println(s[s.startIndex].value) 
     if(i == 0) 
     { 
      s[s.startIndex].value += 1 
     } 
     if(i == 1) 
     { 
      s = s + 2 
      i = 0 
     } 
    } 

我的println打印出來什麼話我輸入正確的價值觀,但我則是無法操縱它在我的if語句。當我嘗試它給出以下錯誤:

Could not find member 'value' 

它甚至可以做我想要的嗎?

回答

5

你會得到該錯誤,因爲UnicodeScalarvalue屬性是隻讀的,但您試圖增加它。

注意,在你的循環變化的東西不會對phrase任何作用 - 這裏有一個方式做你正在使用map()做什麼:

let advanced = String(map(phrase) { 
    (ch: Character) -> Character in 
    switch ch { 
    case " "..."}":         // only work with printable low-ASCII 
     let scalars = String(ch).unicodeScalars  // unicode scalar(s) of the character 
     let val = scalars[scalars.startIndex].value // value of the unicode scalar 
     return Character(UnicodeScalar(val + 1))  // return an incremented character 
    default: 
     return ch  // non-printable or non-ASCII 
    } 
}) 
+0

這裏可能不是一個問題,但是這將截斷「擴展字形集羣」等標誌「」。 – 2014-11-05 16:19:37

+1

對。 **警告:不是Unicode安全的。** – 2014-11-05 16:28:01

+1

您可以通過添加一個檢查'if ch < "A" || ch >「Y」{return ch}「或任何適合於該任務的方法來修復它。 (增加*所有Unicode字符*可能沒有意義。) – 2014-11-05 16:31:18

4

unicodeScalars屬性是隻讀的,所以你不能修改它直接。

你可以做的是建立在(修改)的Unicode標量一個新的字符串:

var text = "HELLO !" 
var newText = "" 

for uni in text.unicodeScalars { 
    var val = uni.value 
    if val >= 0x41 && val < 0x5A { // If in the range "A"..."Y", just as an example 
     val += 1 // or whatever ... 
    } 
    newText.append(UnicodeScalar(val)) 
} 

println(newText) // "IFMMP !" 

但是請注意,val是Unicode值,而不是ASCII碼。如果val位於字母數字字符範圍內或類似 修改它,您可能需要添加 檢查。


更新斯威夫特3:(感謝@adrian。)

let text = "HELLO !" 
var newText = "" 

for uni in text.unicodeScalars { 
    var val = uni.value 
    if val >= 0x41 && val < 0x5A { // If in the range "A"..."Y", just as an example 
     val += 1 // or whatever ... 
    } 
    newText.append(Character(UnicodeScalar(val)!)) 
} 

print(newText) // "IFMMP !" 
+0

它看起來像用於指定新字符的UnicodeScalar值的方法已更改。我發現這一點,但我無法弄清楚我應該做什麼。 https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift – Adrian 2017-02-14 02:16:57

+0

@Adrian:當我回到我的電腦時,我會更新它。 – 2017-02-14 02:31:27

+0

太棒了!我正在取得一些進展......如果我在你之前到達那裏,我會發表評論。我試圖用'var stringMap = string.unicodeScalars.map({$ 0.value})'映射它們,並通過一個開關來運行這些元素來增加它們。 – Adrian 2017-02-14 02:44:29

0

我結束了一個非常簡單的解決方案來。

我剛剛存儲的號碼在一個新的變量,一旦我有它轉換

s = String(character).unicodeScalars 
x = s[s.startIndex].value 

x += 1 
+0

但是這不會修改字符串。我們誤解了你的問題嗎? – 2014-11-05 17:09:10

+0

它不直接修改字符串,但它允許我更改單個字符。 有可能我沒有清楚地解釋這個問題。 – Eabryt 2014-11-05 17:43:31