[iOS] Swift 5 String 的 substring 修改小地雷

Swift 5 看來真的是大改。

照道理 String 的 substring 這樣常用的東西,應該不會有太多變動,結果還是讓我遇到 Warning,說 substring 已經 deprecated,要改用 subscript 的方式。

查了一下,要改為 Array 取用的方式,然後不給 Start ,用「..<」這樣的形式,就可以指定要從開頭拿到某個位置。

那個 「<」後面要接一個 String.Index ,沒注意到這一點,所以改為這樣的形式之後,持續出現 compiler Error。剛開始以為是我語法寫錯,後來翻了一下 Swift Programming Language 裡面關於這個的介紹,看來看去,沒發現有問題啊。

Compiler Error 長這樣:「subscript ‘subscript _: ‘ requires the types ‘String.Index’ and ‘Int’ be equivalent」。

翻來翻去真是百思不得其解,明明都寫對,為啥還會出錯。

於是又開始了網上 Google 答案之旅,最後是被一篇 Tweet 解救了(感謝 Twitter 上的善心人士)。原來,substring 改為 subscript 的形式之後,取出來的並不會變成一個新的 String(原先 substring 會傳回一個新的 String)。取出的 substring 會是原本 String 當中的那一段 Characters。

解救眾生的 Tweet 在此: https://twitter.com/jckarter/status/1156936658639417345 。

關鍵是要把 subscript 取到的片段用 String constructor 包起來,變成一個新的字串,這樣就不會出現這個 Compiler Error。我說 Swift Compiler 你能不能把 Error Message 寫清楚一點啊,搞半天你的 Error Message 跟問題看起來一點關係都沒有,加上一個 String constructor 就搞定的事情,卻一直跟工程師講說 String.Index & Int 兩個 Type 不合,真是猜不透你啊。

所以改過的方式就會變成:

let sSource = "hello world"
let index = sSource.index(before: sSource.endIndex)
let sNew = String(sSource[..<index])

這樣就會讓 sNew 是抓到字串的倒數前一個字為止,也就是 “hello worl”。

如果有遇到類似訊息的朋友,可以嘗試看看用上面這樣的解法,說不定可以幫你省下找 Compiler Error 解法的時間。

是說 String 改這樣好像也沒有比較好用,還是單純因為我 Java 工程師的偏見。相比之下我覺得 kotlin 那樣比較好,這是題外話了。

Happy Coding!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料