WWDC24 What’s new in Swift

更新 發佈閱讀 14 分鐘

New Zealand - Deer Park Heights Queenstown

New Zealand - Deer Park Heights Queenstown

Swift over the years


raw-image

因為從 Swift 2 到 Swift 3,因為 Xcode 的關係,導致用戶一定要被迫升級 Swift 3,而且那次是大改版很難升級,但到 Swift 4 之後,Apple 團隊之後的解法是讓 Compiler 可以支持多種版本,不用被迫一次升級全部的 Swift 程式碼,所以一個專案內有 Swift 3 或 Swift 4 的編譯,這樣就可以逐步使用新語言,可以準備就緒後再 migrate。

Swift 5 之後,穩定了 ABI,這表示對 app 開發者來說,減少了下載大小,因為就不再需要在 App 中捆綁 Swift 標準資料庫的完整副本,所以 Swift 標準資料庫是操作系統本身的一部分,而且針對操作系統進行了優化,並在所有 Swift App 和框架中共享。

Swift 6 提供數據競爭的安全保障,盡可能可以寫出正確的併發程式碼

Swift project update


community structure

swift.org/community

raw-image

Swift everywhere


supported platforms

  • Apple platforms
  • Linux
  • Ubuntu
  • Amazon Linux
  • CentOS
  • Red Hat UBI
  • Fedora (🆕)
  • Debian (🆕)
  • Windows

Tools

  • Xcode

Language server

SourceKit LSP: 適合用於 Swift 的語言服務器實現,可以讓 IDE 和編輯器整合 Swift 支持

  • VSCode
  • Neovim
  • Emacs

Cross compilation

raw-image

可以在 macOS 上開發後,將程式部署到 Linux 服務器或 Container

Static Linux SDK for Swift

Builds Linux binaries on macOS

No need to install additional packages

Built on Swift Package Manager support for SDK

Foundation

raw-image

swift-foundation 是開源的

Swift Testing

它利用了 Macro 以及現代 Swift 功能,並整合併發功能,無縫整合。

他也是以開源的,兼顧了跨平台服務

raw-image

  • Declare a test function
  • Customize a test’s name
  • Organize test function with tags
  • Parameterize test with arguments

其他細節可以參考

WWDC24 — Meet Swift Testing

WWDC24 — Go further with Swift Testing

Build

Implicitly built modules

raw-image

每次 build code,都會先處理一些 module,例如 SwiftUI, SwiftDat,而且往更深層的其他 module,其他程式碼也是,這部分沒辦法併發,所以在 debug 時,他也需要建立自己的版本,第一次 po 會比較久。

Explicitly built modules

  • More parallelism in builds
  • Better visibility into build steps
  • Improved reliability of builds
  • Faster debugger start-up

raw-image

但現在改成這樣,可以加速 build code 和 debugger 速度

可以在 Xcode 中啟用 Explicitly Built Modules

raw-image

更多細節可以參考

WWDC24 — Demystify explicitly built modules

以前 Swift 是在 apple 底下

github.com/apple/swift

github.com/apple/swift-format

github.com/apple/swift-evolution

但現在變成

github.com/swiftlang

並由 Swift Project 管理

Language updates


Swift 6 引用了一種可實現數據競爭安全性的新語言模式

Noncopyable types

所有的 Swift 類型,不管是 reference type or value type,默認情況都是可以 copy 的,noncopyable type 會禁用這種默認情況。

這很適合在文件等,獨特的系統資源,這樣就可以避免多次寫入同一個文件,也可以防止在沒有自動清理的情況下,很容易引起的 resource leak 問題

raw-image

我們可能再打開文件和初始化之間寫一些程式碼,這會終止程式,deinitializer 永遠無法執行從而導致 resource leak,我們可以使用 optional 的 init 解決這問題

raw-image

在 Swift 5.10 對 noncopyable 的類型支援只有 value type,在 Swift 6 所有 generic 上下文和 Standard library 的 optional 等,都引入了 noncopyable 的型別支持

  • Supported in all generic contexts
  • Standard library support for Optional , Result , Unsafe pointers

更多細節請參考

WWDC24 — Consume noncopyable types in Swift

除了表單獨特所有權,noncopyable 還讓我們精細控制性能,在資源嚴重受限的底層系統中,copy 成本有可能變很高,因此這情況也適合使用 noncopyable

  • Express unique ownership
  • Fine-grained performance control

Embedded Swift

底層系統在內存、儲存和運行時功能方面受到限制,由於他們的佔用空間小, C 和 C++ 一直是在這類型系統上進行 coding 的首選,現在可以使用 Swift 了。

Embedded Swift 是 Swift 的新語言子集和編譯模型,他們可以生成非常小的獨立二進制文件,適用於高度受限的系統。

他會關閉某些需要運行時支持的語言功能,例如 reflection 和 “any” types,並使用編程技術,比如 full generic specialization,和靜態連結,來生成合適的二進制文件,儘管關閉了一些語言功能,但 Embedded Swift 子及,感覺還是非常接近「完成版」Swift,讓你可以輕鬆繼續寫慣用易讀的 Swift code

  • New language subset
  • New compilation model
  • Small and standalone binaries
  • Disables features that need a runtime: reflection, “any” types
  • Special compiler techniques: full generic specialization, static linking
  • Embedded Swift is close to full Swift

借助 Embedded Swift,還可以寫小遊戲,這遊戲的二進制文件大小,超級小

raw-image

System with limited memory

當然 Embedded Swift,不僅用於娛樂和遊戲,也可以用在構建工業應用 app

ARM and RISC-V microcontrollers

  • Raspberry Pi Pico
  • Espressif ESP32
  • STMicroelectronics STM32
  • Nordic Semiconductor nRF52

Apple 的 Secure Enclave (安全隔區處理器)就使用 Embedded Swift

他是獨立於主處理器的獨立子系統

  • Brings memory safety to embedded systems
  • Incremental adoption with Swift’s interoperability

更多細節可參考

WWDC24 — Go small with Embedded Swift

C++ interoperability

去年推出了與 C++ 的雙向互操作性,Swift 可以直接與 C++ 進行互相操作,目前還在不斷擴充

  • Virtual methods
  • Default arguments
  • C++ move-only types

std::map , std::set , std::optional , std::chrono::duration

  • Incrementally adopt Swift in C++ projects
  • Improved security and productivity

其他細節可以參考去年的

WWDC23 — Mix Swift and C++

Typed throws

以前在 do catch 中要處理特定錯誤要這樣寫

raw-image

但在 Swift 6 可以這樣做,直接指定 error type

raw-image

When to use typed throws

  • Same module error handling
  • Propagating error type in generic contexts
  • Constrained environments

上述情況下,使用非 typed throws 成本過高

Swift 6 的升級點

raw-image

最關鍵的是 Data-race safety

Data-race safety

因為我們寫併發程式 concurrent programs,很容易寫出 data race,當多個 threads 共享資料時,而其中一個 thread 試圖更改資料,很有可能就會出事。

Data race 的問題,一直是 Swift concurrent 的主要目標

raw-image

用於保護可變狀態的 Actor 以及實現安全資料共享的 Sendable,到 Swift 5.10 借助完整的 Concurrency 檢查標誌,實現了 data race 的安全性,所以到 Swift 6 已經默認提供 data race 的安全保障,在編譯,在編譯時就會檢查

後續我們也可以逐步的將 Module 升級至 Swift 6,不用一次全部

raw-image

禁止跨越 Actor 隔離邊界傳遞所有非 Sendable 的值,Swift 6 可以識別出,在非 Sendable 的值無法在從原始隔離邊界進行引用的情況下傳遞他們是安全的。

raw-image

如果使用 Swift 5.10 的完整併發檢查,將非 Sendable client 引用從 MainActor 傳遞到 ClientStore Actor 將會導致 compiler 警告,但現在因為這個變數 client 不會在兩邊互相傳遞,就不會被檢查出錯誤。

可是把 client 引用傳遞給 ClientStore Actor 之後又將它引入 logger ,這時候就會報錯,表明是一個 data race。

raw-image

Swift 6 除了 Actor 提供的高級同步功能,還有其他新的底層東西

import Synchronization

raw-image
raw-image

Mutex,和 Atomic 一樣,也應該存在 ‘let’ 屬性中,假如要訪問 Mutex 屬性,都要透過 withLock 方法的閉包,從而確保實現互斥訪問。

Road to data-race safety

  • Incremental migration
  • Improved data-race checking
  • New low-level synchronization primitives

其他細節可參考

WWDC24 — Migrate your app to Swift 6

Wrap-up


  • Language improvements
  • Data-race safety
  • Swift everywhere

Resources


https://developer.apple.com/wwdc24/10136

https://youtu.be/17fZZ1v_N2U?si=8J5byKhPdmYDEiFR

留言
avatar-img
留言分享你的想法!
avatar-img
CHENGYANG的沙龍
0會員
18內容數
CHENGYANG的沙龍的其他內容
2025/06/08
這篇是閱讀了喵神的文章 TCA — SwiftUI 的救星?,這一系列喵神分成了四篇來講解,每篇都有許多重點,而且也是從易到難,很好閱讀,以下是個人的學習筆記,內容幾乎原文搬過來的,但也有一些是學習過程中額外補充的,因為有語法的更新,所以建議可以先閱讀原文,假如遇到語法不支援之類的問題,在參考這
Thumbnail
2025/06/08
這篇是閱讀了喵神的文章 TCA — SwiftUI 的救星?,這一系列喵神分成了四篇來講解,每篇都有許多重點,而且也是從易到難,很好閱讀,以下是個人的學習筆記,內容幾乎原文搬過來的,但也有一些是學習過程中額外補充的,因為有語法的更新,所以建議可以先閱讀原文,假如遇到語法不支援之類的問題,在參考這
Thumbnail
2025/06/08
這篇是閱讀了喵神的文章 TCA - SwiftUI 的救星?,這一系列喵神分成了四篇來講解,每篇都有許多重點,而且也是從易到難,很好閱讀,以下是個人的學習筆記,內容幾乎原文搬過來的,但也有一些是學習過程中額外補充的,因為有語法的更新,所以建議可以先閱讀原文,假如遇到語法不支援之類的問題,在參考這邊。
Thumbnail
2025/06/08
這篇是閱讀了喵神的文章 TCA - SwiftUI 的救星?,這一系列喵神分成了四篇來講解,每篇都有許多重點,而且也是從易到難,很好閱讀,以下是個人的學習筆記,內容幾乎原文搬過來的,但也有一些是學習過程中額外補充的,因為有語法的更新,所以建議可以先閱讀原文,假如遇到語法不支援之類的問題,在參考這邊。
Thumbnail
2025/05/17
What is Observation? Observation 是 Swift 中用於追蹤屬性變化的新功能,透過 macro 對它們進行轉換。在 SwiftUI 裡針對特別的 property 發生變化時,才重新計算 View 的 body。
Thumbnail
2025/05/17
What is Observation? Observation 是 Swift 中用於追蹤屬性變化的新功能,透過 macro 對它們進行轉換。在 SwiftUI 裡針對特別的 property 發生變化時,才重新計算 View 的 body。
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
只是 Swift 以 language level 支援 Optional 確實比用 API level 支援的 Java 要簡潔和更具可讀性。Swift 作為一個全新的語言,從一開始的設計就將許多好的語言特性加入,確實讓人驚豔。
Thumbnail
只是 Swift 以 language level 支援 Optional 確實比用 API level 支援的 Java 要簡潔和更具可讀性。Swift 作為一個全新的語言,從一開始的設計就將許多好的語言特性加入,確實讓人驚豔。
Thumbnail
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
Thumbnail
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
Thumbnail
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
Thumbnail
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News