2017-04-06 92 views
1

我想從標籤中讀取字符串並刪除它的最後一個字符。Swift字符串操作不起作用

這是我正在嘗試:

@IBAction func del(sender: UIButton) { 
    let str = telephone.text!; 
    let newstr = str.remove(at: str.index(before: str.endIndex)) 
    telephone.text = newstr; 
} 

當我跑,我得到一個錯誤:

"String" does not have a member named "remove" 

有人可以幫我找出這個問題? 剛開始學習迅速:(

+1

在遊樂場我可以編譯你的代碼,並預期它會成功。嘗試使用'let str =「Test」'進行測試。順便說一句,你不需要在行尾使用';'。 – LinusGeffarth

+0

我嘗試了「東西」作爲文本和IDE仍然給出了同樣的錯誤:( – ssdesign

+1

'刪除(在:))突變接收器,並期望一個*變量* –

回答

1

remove(at:)變異的接收器,因此它必須是一個可變 字符串:

var str = telephone.text! 
str.remove(at: str.index(before: str.endIndex)) 
telephone.text = str 

或者使用substring(to:),返回新字符串 不是修改接收機:

let str = telephone.text! 
let newstr = str.substring(to: str.index(before: str.endIndex)) 
telephone.text = newstr 
+0

謝謝,這也工作:) – ssdesign

0

您可以使用:

let idx = str.index(before: str.endIndex) // compute the index 
let s = str.substring(to: idx)   // get the substring 
+0

這是什麼意思? – LinusGeffarth

+0

獲取請求的子字符串。 –

+0

但爲什麼索引的額外變量? – LinusGeffarth

0

remove定義如下:

public mutating func remove(at i: String.Index) -> Character 

參見mutating改性劑?這意味着它會調用調用該方法的實例。在你的情況下,實例是str,一個常量。由於常量不能被突變,所以代碼不能編譯。

而且由於remove返回刪除的字符,

let newstr = str.remove(at: str.index(before: str.endIndex)) 

這裏newstr不會存儲與刪除的最後一個字符的字符串。

你應該重寫方法是這樣的:

telephone.text!.remove(at: telephone.text!.index(before: telephone.text!.endIndex))