當前位置:
首頁 > 最新 > 探索 Swift 4 中新的 String API

探索 Swift 4 中新的 String API

原文:Exploring the new String API in Swift 4 — Swift by Sundell

WWDC 已經結束了(我覺得是自 2014 年來最好的一場 WWDC),同時 Xcode 9 beta 版也發布了,很多開發者已經開始把玩 Swift 4 ,今年的新版本真心不錯,這是一個改進版本而不是重構版本(像 Swift 2 和 3),因此大多數代碼升級起來會更容易。

其中一個改進是 String 的 API,在 Swift 4 中更易用,也更強大。在過去的 Swift 版本中,String API 經常被提出為一個例子用來說明正確性,以繁瑣的方式處理字元和子串。

本周,我們來看看在 Swift 4 中如何使用 String,以及如何在各種情況下利用新的改進的 API。

多行字元串

有時我們的應用或腳本中有很長的靜態字元串會跨越多行。在 Swift 4之前,我們只能在字元串之間插入 來換行, 通過給 String 添加一個 方法,多次 來添加換行符用來大段文本輸出。

譯者註:這裡的腳本指的是命令行程序

比如,下面是 的 方法(用於列印腳本的使用說明)在 Swift 3 看起來如下:

func printHelp() { print("Test Drive") print("--------------") print("Quickly try out any Swift pod or framework in a playground.") print("Usage:") print("- Simply pass a list of pod names or URLs that you want to test drive.") print("- You can also specify a platform (iOS, macOS or tvOS) using the -p option") print("- To use a specific version or branch, use the -v argument (or -m for master)") print("Examples:") print("- testdrive Unbox Wrap Files") print("- testdrive https://github.com/johnsundell/unbox.git Wrap Files") print("- testdrive Unbox -p tvOS") print("- testdrive Unbox -v 2.3.0") print("- testdrive Unbox -v swift3") }

Swift 4 中處理多行文本字元串:

func printHelp() { print( """ Test Drive -------------- Quickly try out any Swift pod or framework in a playground. Usage: - Simply pass a list of pod names or URLs that you want to test drive. - You can also specify a platform (iOS, macOS or tvOS) using the -p option - To use a specific version or branch, use the -v argument (or -m for master) Examples: - testdrive Unbox Wrap Files - testdrive https://github.com/johnsundell/unbox.git Wrap Files - testdrive Unbox -p tvOS - testdrive Unbox -v 2.3.0 - testdrive Unbox -v swift3 """ ) }

如上所示,當使用多行文本字元串時,代碼會表示得更加清楚和整潔,我們不需要再添加很多 換行符,而是簡單地在字元串中添加真正的換行符,使得在運行腳本之前,可以很容易地看到輸出後的樣子。

在縮進方面,多行文本字元串使用底部的 來確定字元串的基礎縮進,所以跟這些引號對齊的所有內容都不會在字元串中進行額外的真實縮進。

字元串是集合(再次)

在 Swift 1 中,String 遵循了 (Swift 3+ 中的 )協議,這意味著您可以對它們執行各種收集操作(比如 , 等)。 您仍然可以在 Swift 2 & 3 中進行此操作,通過訪問 屬性,但這很快會導致閱讀代碼更難。

Swift 4 中字元串再次成為了集合對象,這意味著你可以簡單地將它們視為「字符集合」。這可能會很有用,比如從字元串中過濾出某些字元(讓我們以嘆號為例):

let filtered = string.filter { $0 != "!" }新的 Substring 類型

Swift 4 引入了一種處理子字元串的新方法,使用了一個完全不同的類型 Substring 。現在大多數方法都會返回 Substring(如 ),並且還引入了一個新的 subscripting API,讓你可以快速訪問一個子字元串:

// 從一個置頂的 let substring = string[index...]

我們來看一個例子,我們截斷用戶輸入的文本返回一個子字元串,將其限制在一定長度。在 Swift 3 中,你會寫成這樣:

extension String { func truncated() -> String { return String(characters.prefix(truncationLimit)) } }

(編輯注釋:我之前用的是一個更複雜的例子,感謝 Ole Begemann 指出這個更好的解決方案)

好消息是,由於 Swift 4 代碼大多數兼容 Swift 3,所以上述代碼同樣可以在 Swift 4 下運行。但更好的消息是,由於 String 在 Swift 4 中是集合類型,我們可以直接簡化上述代碼為:

extension String { func truncated() -> Substring { return prefix(truncationLimit) } }

上面用 方法返回最多為 n 個元素的子序列,同時包括邊界檢查(如果我們的集合(這裡是字元串)包含少於 n 個元素的時候,以防我們不會遇到錯誤)。

你可以看到上面的 方法的返回類型現在是新的 Substring 類型。雖然起初看起來很累贅因為字元串現是一個不同的類型,但它在內存可預測性方面給了我們很大的優勢。

為了避免創建許多冗餘拷貝,Swift 字元串使用 「write on write」 方式只需要在需要時進行拷貝。這意味著子字元串通常與內存中的父字元串共享相同的底層緩衝區。但是在 這個例子中,我們不想在內存中保留整個未截斷的字元串,只是為了能夠使用截斷的子字元串。

通過給我們一個 Substring 類型,而不是一個完整的 String,Swift 現在 「強制」 我們在需要時顯式拷貝副本,讓父字元串的內存可以被釋放。我們可以簡單地從截取的子字元串創建一個新的 String ,如下所示:

label.text = String(userInput.truncated())結論

由於幾乎所有的 Swift 應用和腳本都會處理字元串,所以很高興能看到這些 API 的改進。我認為新的 API 是在正確性和易用性之間的一個很好的權衡,同時也要求程序員在 copy 時慎重選擇,像 Substring 一樣。

我沒有在這篇文章中介紹的字元串 API 也有更多的進步,比如 Unicode 9 支持更簡單的字元管理,並且能夠輕鬆訪問構成字元的底層 Unicode 代碼。

我們將在即將發布的後續文章包括 WWDC 中發布的其他新的 Swift 4 API 、框架、工具中深入研究字元串處理和編碼。敬請關注!

如何在 Swift 4 中找到新的 String API?String 現在是集合類型真的會讓你的字元串處理更簡單嗎?如果你有類似問題或其他問題請讓我知道,意見或反饋可以在這裡評論或Twitter @johnsundell。

感謝閱讀!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

R 非線性回歸入門——以 osf.io/79xtn 為例
kubelet 源碼分析:statusManager和probeManager
營銷的秘密:消費者想買的並不是產品
應用沉睡之時:後台傳輸服務
RabbitMQ 實戰教程 路由

TAG:推酷 |

您可能感興趣

宏碁Swift/Aspire與Spin PC系列產品全線更新
Windows 10 RS4將新增Swift Pair功能
iOS swift UISearchBar拿到textfield控制項
Hermes 愛馬仕 kelly Flat 35CM CK18大象灰 Swift
adidas Originals Swift Run PK推出全新配色
Swift for TensorFlow 已在 GitHub 上開源,Tensor 成為 Swift 語言裡面的一等公民
基於Swift 5的編程教學Swift Playgrounds即將推出
Swift與Fedora
Coca-Cola 升級四種全新口味,Taylor Swift 首度演繹新單《ME!》
Gigi Hadid和Taylor Swift超酷閨蜜裝
阿迪達斯adidas Originals SWIFT Primeknit 經典速跑百搭襪子慢跑鞋「黑武士」CG4126
蘋果 SwiftUI 踢館穀歌 Flutter
Taylor Swift 霉霉最新宣傳單曲《The Archer》 突襲上線!
Swift For TensorFlow開源,敲響了Python的喪鐘?
iOS限免App精選:CALC Swift
介紹 Fedora 上的 Swift
Kotlin和Swift語言在Redmonk榜上排名大幅提升
谷歌又開源了:Swift for TensorFlow
蘋果編程應用Swift Playgrounds升級到2.0
Acer新品亮相:主打輕薄的Swift和四款Chromebook