WWDC 2026: Khám Phá Toàn Diện Những Cải Tiến Đột Phá Trong Swift 6.3 & 6.4

WWDC 2026 đã mang đến những làn gió mới cho thế giới phát triển ứng dụng với việc ra mắt Swift 6.3Swift 6.4. Chủ đề xuyên suốt của những phiên bản này tập trung vào việc giảm thiểu mã rập khuôn (boilerplate), hạn chế những bất ngờ không mong muốn, và trao quyền kiểm soát nhiều hơn cho nhà phát triển. Buổi giới thiệu đã đi sâu vào bốn lĩnh vực chính: cải tiến ngôn ngữ, cập nhật thư viện, hỗ trợ đa nền tảng, và tối ưu hiệu năng. Bài viết này sẽ tổng hợp chi tiết tất cả những gì được công bố, bao gồm cả những tính năng của Swift 6.3 đã ra mắt trước đó nhưng được nhắc lại tại sự kiện.

I. Những Cải Tiến Đáng Giá Về Ngôn Ngữ

Phiên bản Swift 6.3 và 6.4 mang đến nhiều nâng cấp mạnh mẽ, giúp ngôn ngữ trở nên trực quan, an toàn và hiệu quả hơn trong quá trình phát triển ứng dụng.

1. Chẩn Đoán Swift Concurrency Tốt Hơn

Trình biên dịch Swift giờ đây có khả năng phát hiện lỗi đồng bộ hóa tốt hơn và cung cấp hướng dẫn rõ ràng khi gặp vấn đề. Hai mẫu lỗi trước đây dễ dàng bỏ qua giờ đã được chẩn đoán chính xác: bắt lỗi bên trong khối Task và lưu tham chiếu tác vụ để sử dụng sau. Điều này giúp mã đồng bộ của bạn trở nên đáng tin cậy hơn.

// Bắt lỗi bên trong một Task
Task {
    do {
        try lander.fly(to: moon)
    } catch {
        lander.abort()
    }
}

// Lưu một Task để sử dụng sau
let landingTask = Task {
    try lander.fly(to: moon)
}

defer {
    await orbiter.rendezvous(with: lander)
}

try await orbiter.justHangOut(waitingFor: landingTask)

2. Cải Thiện Khả Năng Tuân Thủ `Sendable`

Việc làm việc với giao thức Sendable trong các hệ thống phân cấp lớp (class hierarchies) trở nên linh hoạt hơn. Giờ đây, bạn có thể đánh dấu một lớp là ~Sendable để từ chối tuân thủ giao thức này, và các thuộc tính weak let cũng được hỗ trợ trong các kiểu Sendable.

final class Spacecraft: Sendable {
    weak let dockedAt: SpaceStation?  // weak let giờ đã hoạt động trong các kiểu Sendable
}

class Mission: ~Sendable { ... }

class CrewedMission: Mission, @unchecked Sendable { ... }

3. Các Hàm Khởi Tạo Thành Viên (Memberwise Initializers) Dễ Tiếp Cận Hơn

Swift giờ đây tự động tạo nhiều hàm khởi tạo thành viên ở các cấp độ truy cập khác nhau, dựa trên khả năng hiển thị của thuộc tính. Nếu một struct có cả thuộc tính internalprivate, bạn sẽ nhận được cả hàm khởi tạo internal (không bao gồm các thuộc tính private) và hàm khởi tạo private (với tất cả thuộc tính). Điều này giúp giảm đáng kể mã rập khuôn khi phải viết các hàm khởi tạo thủ công để xử lý kiểm soát truy cập.

struct Briefing {
    internal var topic: String
    internal var scheduledAt: Date
    private  var attendees: [Person] = []
}

// Swift tự động tạo cả hai:
// internal init(topic:scheduledAt:)
// private  init(topic:scheduledAt:attendees:)

4. Rút Gọn `anyAppleOS` Cho Khả Dụng Nền Tảng

Bạn có mệt mỏi khi phải liệt kê từng nền tảng của Apple trong các chú thích khả dụng (availability annotations) không? Swift 6.4 giới thiệu anyAppleOS như một cách viết tắt, bao gồm iOS, macOS, watchOS, tvOS và visionOS chỉ trong một lần. Tính năng này hoạt động cả trong thuộc tính @available và điều kiện #if, giúp mã sạch hơn và dễ đọc hơn.

// Trước đây
@available(macOS 27, iOS 27, watchOS 27, tvOS 27, visionOS 27, *)
func showStatus() { ... }

// Sau này
@available(anyAppleOS 27, *)
func showStatus() { ... }

#if os(anyAppleOS)
func makeLiveActivityWidget() -> some Widget { ... }
#endif

Bạn vẫn có thể thêm các ngoại lệ cụ thể cho từng nền tảng:

@available(anyAppleOS 27, *)
@available(tvOS, unavailable)
func launch() { ... }

5. `@diagnose` – Kiểm Soát Cảnh Báo Linh Hoạt

Thuộc tính @diagnose mới cho phép bạn kiểm soát cách trình biên dịch xử lý các chẩn đoán cụ thể trên cơ sở từng khai báo. Bạn có thể tắt một cảnh báo không dùng nữa (deprecation warning), nâng một cảnh báo lên thành lỗi, hoặc hạ một lỗi trong tương lai xuống thành cảnh báo – tất cả đều được giới hạn trong một hàm duy nhất.

// Tắt một cảnh báo không dùng nữa với lý do
@diagnose(DeprecatedDeclaration, as: ignored, reason: "Bay với phần cứng dư thừa")
func makeApolloSoyuzMission() -> Mission { ... }

// Coi kiểm soát bộ nhớ nghiêm ngặt là cảnh báo thay vì mặc định
@diagnose(StrictMemorySafety, as: warning)
func uplinkCommand(from receiver: inout Receiver, to computer: inout Computer) { ... }

// Coi một lỗi Swift trong tương lai là lỗi ngay bây giờ, trước khi phiên bản được nâng cấp
@diagnose(ErrorInFutureSwiftVersion, as: error)
func fetchPosition() -> (x: Double, y: Double, z: Double) { ... }

6. Bộ Chọn Module (`::` Syntax)

Khi hai module được import xuất cùng một tên, Swift 6.3 cung cấp một cách rõ ràng để chỉ định: bộ chọn module hai chấm (::). Nó hoạt động trên cả kiểu dữ liệu và thành viên. Điều này giải quyết hiệu quả các xung đột tên và làm cho mã của bạn minh bạch hơn.

import Rocket
import GiftShopToys

let rocket2 = Rocket.SaturnV()   // mơ hồ — ưu tiên Rocket.SaturnV của module Rocket
let rocket3 = Rocket::SaturnV()  // rõ ràng — chắc chắn là SaturnV của module Rocket

Nó cũng giải quyết xung đột tên phương thức từ các extension giao thức:

// Gọi phiên bản fire() của HumanResources, không phải của Chemistry
launchPadTechnician.HumanResources::fire()

Bộ chọn module cũng hoạt động với chính module Swift, hữu ích khi một tên cục bộ che giấu một kiểu thư viện tiêu chuẩn:

let task = Swift::Task {
    // công việc bất đồng bộ
}

7. Thuộc Tính `@c` Để Tương Tác Với Mã C

Swift 6.3 giới thiệu thuộc tính @c, cho phép bạn đưa các hàm và enum của Swift ra mã C. Việc chú thích một hàm bằng @c khiến Swift thêm một khai báo tương ứng vào tiêu đề C được tạo – không yêu cầu chỉnh sửa thủ công tiêu đề cầu nối (bridging header).

@c
func callFromC() { ... }

// Tiêu đề C được tạo:
// void callFromC(void);

Bạn có thể cung cấp một tên tùy chỉnh cho khai báo C được tạo:

@c(MyLibrary_callFromC)
func callFromC() { ... }

// Tiêu đề C được tạo:
// void MyLibrary_callFromC(void);

@c cũng có thể kết hợp với @implementation, cho phép bạn viết một triển khai Swift cho một hàm đã được khai báo trong tiêu đề C. Swift sẽ xác thực rằng các chữ ký khớp nhau thay vì tạo một khai báo mới.

// C header
void callFromC(void);
// Swift implementation
@c @implementation
func callFromC() { ... }

II. Cập Nhật Thư Viện Mang Tính Đột Phá

Các cập nhật thư viện trong Swift 6.3 và 6.4 tập trung vào việc nâng cao an toàn, hiệu quả và khả năng kiểm soát trong các tác vụ phổ biến.

1. `withTaskCancellationShield`

Đôi khi, một tác vụ phải hoàn thành ngay cả khi tác vụ cha bị hủy – ví dụ như việc gửi tín hiệu khẩn cấp. Wrapper withTaskCancellationShield mới bảo vệ một khối mã khỏi việc hủy tác vụ, cho phép nó chạy đến khi hoàn thành mà không bị gián đoạn.

extension EmergencyTransponder {
    func sendSOS() {
        withTaskCancellationShield {
            radio.send(makeSOSPacket())
        }
    }
}

2. `Continuation` An Toàn Với Các Kiểu

Việc kết nối các API dựa trên callback với Swift concurrency luôn đòi hỏi một sự đánh đổi: UnsafeContinuation nhanh nhưng im lặng khi bị sử dụng sai, trong khi CheckedContinuation bắt lỗi nhưng phải trả giá bằng việc cấp phát bộ nhớ phụ. Swift 6.3 bổ sung tùy chọn thứ ba, Continuation<Success, Failure>, biến việc gọi resume hai lần thành lỗi biên dịch và việc thiếu resume thành lỗi runtime – mà không có chi phí bổ sung trên đường dẫn nhanh.

let value = try await withContinuation { continuation in
    someCallbackAPI { result in
        continuation.resume(returning: result)
    }
}

3. `Ref` và `MutableRef`

Việc lưu trữ tham chiếu đến một phần của cấu trúc dữ liệu trước đây yêu cầu một class (cấp phát heap, đếm tham chiếu) hoặc UnsafePointer (đi kèm với mọi rủi ro không an toàn). Swift 6.3 thêm Ref<T>MutableRef<T> vào thư viện chuẩn: các kiểu an toàn nắm giữ các tham chiếu được chia sẻ và độc quyền đến một giá trị tương ứng, có thể sử dụng làm biến cục bộ, thành viên struct và tham số kiểu generic.

4. `Dictionary.mapKeyedValues`

Một bổ sung nhỏ nhưng đáng hoan nghênh. Khi bạn cần chuyển đổi giá trị từ điển trong khi vẫn giữ quyền truy cập vào key, trước đây bạn phải xây dựng kết quả một cách thủ công. Giờ đây, có một phương thức chuyên dụng cho mục đích này.

// Trước đây
let new: [Mission: String] = .init(
    uniqueKeysWithValues: missions.lazy.map { mission, launchWindow in
        (mission, makeDisplayName(for: mission, in: launchWindow))
    }
)

// Sau này
missions.mapKeyedValues { mission, launchWindow in
    makeDisplayName(for: mission, in: launchWindow)
}

5. Kiểu `FilePath` Mới Trong Foundation

Foundation có một kiểu FilePath mới xử lý chính xác các resource fork của macOS và các tài nguyên được đặt tên (hậu tố đường dẫn ..namedresource/rsrc). Khi lặp qua các thành phần đường dẫn, nó sẽ tự động loại bỏ các hậu tố đặc trưng của nền tảng này.

var path: FilePath = "/var/www/static/..namedresource/rsrc"
print(path.components)
// [ "var", "www", "static" ]

6. Cải Tiến Swift Testing: Mức Độ Nghiêm Trọng, Hủy Kiểm Tra & Đính Kèm Ảnh

Swift Testing nhận được ba cải tiến quan trọng:

  • Đầu tiên, bạn có thể ghi lại một vấn đề với mức độ nghiêm trọng `.warning` – hữu ích cho những lỗi nhẹ không cần dừng kiểm tra.
    Issue.record(
        "\(rocket.name) lượng nhiên liệu còn lại dưới 10% mục tiêu dự trữ",
        severity: .warning
    )
    
  • Thứ hai, `Test.cancel` cho phép một bài kiểm tra tự dừng sớm với một thông báo, điều này sạch sẽ hơn là một lệnh return có điều kiện và biểu cảm hơn là việc bỏ qua.
    if rocket.engineType == .solid {
        try Test.cancel("\(rocket.name) có nhiên liệu rắn")
    }
    
  • Thứ ba, giờ đây bạn có thể đính kèm hình ảnh vào kết quả kiểm tra trên các nền tảng Apple và Windows thông qua các module overlay import chéo mới với UIKit và các framework UI khác. Hữu ích cho các kiểm tra kiểu ảnh chụp (snapshot-style tests) khi việc xem những gì đã được render quan trọng như việc xác nhận có được thông qua hay không.

7. Khả Năng Tương Tác XCTest

Giờ đây bạn có thể tự do kết hợp các khẳng định của XCTest và các kỳ vọng của Swift Testing trong cùng một codebase – gọi XCTAssertEqual từ một bài kiểm tra Swift Testing, hoặc sử dụng #expect bên trong một XCTestCase. Việc di chuyển từ XCTest không còn phải là tất cả hoặc không có gì.

8. Streaming Đầu Ra Của Subprocess

Subprocess giờ đây hỗ trợ truyền tải đầu ra thông qua .sequence, cho phép bạn xử lý đầu ra lệnh một cách lười biếng (lazily) khi nó đến, thay vì phải chờ quá trình hoàn tất.

let result = try await Subprocess.run(.name("ls"),
                                      input: .none,
                                      output: .sequence,
                                      error: .string(limit: 4096)) { execution in
    execution.standardOutput.strings().filter { $0.hasSuffix(".obj") }
}

for try await objectFiles in result.closureOutput {
    print("Object file: \(objectFiles)")
}

9. Báo Cáo Tiến Độ (Progress Reporting)

Một API ProgressManager mới mang đến khả năng báo cáo tiến độ có cấu trúc với hỗ trợ Swift concurrency. Tiến độ có thể được kết hợp theo phân cấp bằng cách sử dụng các đối tượng subprogress, và các cập nhật có thể được quan sát bằng Observations.

let manager = ProgressManager(totalCount: 100)
try await rocket.launch(mission.subprogress(assigningCount: 100))

Task {
    for await update in Observations({ mission.fractionCompleted }) {
        print("Mission \(Int(update * 100))%")
    }
}

10. Cải Tiến DocC

Swift 6.3 bổ sung ba khả năng thử nghiệm cho DocC mà bạn nên biết nếu duy trì một thư viện:

  1. Đầu ra Markdown. Tạo phiên bản Markdown của các trang tài liệu cùng với JSON được render tiêu chuẩn bằng cách sử dụng --enable-experimental-markdown-output.
  2. Nội dung HTML tĩnh trên mỗi trang. Nhúng một bản tóm tắt HTML nhẹ của mỗi trang – tiêu đề, mô tả, tính khả dụng, khai báo – trực tiếp vào index.html bên trong thẻ <noscript>. Cải thiện khả năng khám phá của công cụ tìm kiếm và khả năng truy cập cho người đọc màn hình mà không yêu cầu JavaScript. Truyền --transform-for-static-hosting --experimental-transform-for-static-hosting-with-content để kích hoạt.
  3. Chú thích khối mã. Các tùy chọn định dạng mới cho các khối mã được bao quanh: nocopy vô hiệu hóa nút sao chép vào clipboard, highlight làm nổi bật các số dòng cụ thể, showLineNumbers hiển thị số dòng, và wrap ngắt dòng dài theo chiều rộng cột.
    let name = "World"              // highlighted
    let greeting = "Hello"
    print("\(greeting), \(name)!")  // highlighted
    

    Kích hoạt bằng cách sử dụng --enable-experimental-code-block-annotations.

III. Tối Ưu Hiệu Năng Vượt Trội

Swift 6.3 và 6.4 mang đến những công cụ mạnh mẽ để các nhà phát triển tinh chỉnh hiệu suất, đảm bảo ứng dụng chạy nhanh và hiệu quả hơn.

1. Kiểm Soát Inlining: `@inline(never)` và `@inline(always)`

Swift giờ đây cho phép bạn kiểm soát rõ ràng việc inlining các hàm khi trình tối ưu hóa cần một sự “đẩy nhẹ”. @inline(never) ngăn chặn một hàm được inlined – hữu ích để kiểm soát kích thước mã hoặc cô lập một hàm trong quá trình phân tích hiệu suất. @inline(always) buộc inlining khi đã biết lợi ích về hiệu suất và xứng đáng với chi phí kích thước mã.

@inline(never)
func makeInts(randomized: Bool) -> [256 of Int] { ... }

@inline(always)
func makeInts(randomized: Bool) -> [256 of Int] { ... }

2. `@specialized` Cho Các Hàm Generic

Các hàm generic tạo ra một triển khai duy nhất hoạt động cho tất cả các kiểu. Khi một kiểu cụ thể được sử dụng thường xuyên, @specialized báo cho trình biên dịch tạo ra một phiên bản chuyên dụng, được tối ưu hóa hoàn toàn cho kiểu đó – đạt được hiệu suất của một hàm không generic mà không từ bỏ API generic.

@specialized(where Values == [UInt8])
func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
    // Trình biên dịch sẽ tạo một phiên bản chuyên biệt cho [UInt8]
}

3. `@export(implementation)` Cho Các Thư Viện Ổn Định ABI

Các tác giả thư viện xây dựng các framework ổn định ABI (Application Binary Interface) giờ đây có thể sử dụng @export(implementation) để hiển thị triển khai của một hàm cho các client, cho phép nó tham gia vào nhiều tối ưu hóa của trình biên dịch qua các ranh giới module – mà không làm hỏng ABI.

4. `~Copyable` và `~Escapable` Trong Các Kiểu Liên Kết Giao Thức

Các giao thức giờ đây có thể thể hiện rằng các kiểu liên kết của chúng không cần phải có khả năng sao chép (copyable) hoặc thoát (escapable), cho phép thiết kế giao thức biểu cảm và hiệu quả hơn – đặc biệt đối với các API dựa trên iterator và span cần tránh các bản sao không cần thiết.

5. Bộ Truy Cập `borrow` và `mutate`

Một cặp bộ truy cập mới thay thế mẫu get/set cũ cho các kiểu gói các con trỏ không an toàn. borrow cung cấp một tham chiếu chỉ đọc mà không sao chép; mutate cung cấp một tham chiếu có thể thay đổi. Cùng với nhau, chúng cho phép các kiểu không sao chép hiển thị các thuộc tính đã lưu một cách sạch sẽ và an toàn.

public var value: Value {
    borrow { valuePointer.pointee }
    mutate { &valuePointer.pointee }
}

6. `MutableRef` Cho Các Truy Cập Được Nâng Lên (Hoisted Accesses)

Các truy cập subscript bên trong vòng lặp – như cập nhật giá trị từ điển – có thể dẫn đến các lần tra cứu lặp lại thừa thãi. MutableRef cho phép bạn nâng truy cập đó ra khỏi vòng lặp một cách thủ công, giữ một tham chiếu có thể thay đổi ổn định đến phần tử trong suốt thời gian hoạt động.

var countRef = MutableRef(&counts[key, default: 0])

for set in sets {
    if set.contains(key) {
        countRef.value += 1
    }
}

IV. Hỗ Trợ Đa Nền Tảng: Swift Vươn Tầm Toàn Cầu

Sự cam kết của Swift với các nền tảng ngoài hệ sinh thái Apple tiếp tục được thể hiện rõ ràng qua những cải tiến mạnh mẽ.

1. Swift SDK Chính Thức Cho Android

Swift 6.3 đã phát hành Swift SDK chính thức đầu tiên cho Android. Giờ đây, bạn có thể xây dựng các chương trình Android native bằng Swift, thêm Android làm target trong các gói Swift của mình, và tích hợp mã Swift vào các ứng dụng Android Kotlin/Java hiện có bằng cách sử dụng Swift Java và Swift Java JNI Core. Đây là một cột mốc quan trọng – target Android đã tồn tại như một nỗ lực cộng đồng trong nhiều năm và giờ đây là một nền tảng được hỗ trợ chính thức, hạng nhất.

Để bắt đầu, bạn có thể tham khảo tài liệu chính thức: Getting Started with the Swift SDK for Android.

2. Cải Tiến Embedded Swift

Embedded Swift tiếp tục trưởng thành trong Swift 6.3, với khả năng tương tác C được tăng cường, hỗ trợ gỡ lỗi tốt hơn và những tiến bộ đáng kể hướng tới một mô hình liên kết hoàn chỉnh. Nếu bạn đang nhắm mục tiêu đến các vi điều khiển hoặc môi trường bare-metal, bài đăng Embedded Swift improvements post sẽ cung cấp chi tiết.

3. Swift Build Preview Trong Swift Package Manager

Swift 6.3 tích hợp bản xem trước của Swift Build – một công cụ xây dựng thống nhất trên tất cả các nền tảng được hỗ trợ – vào Swift Package Manager. Mục tiêu là một trải nghiệm xây dựng đa nền tảng nhất quán hơn. Hãy thử nghiệm trong các gói của bạn và báo cáo vấn đề; tính năng này hiện đang ở chế độ tùy chọn.

SPM cũng có thêm swift package show-traits để khám phá các đặc điểm mà một gói hỗ trợ, và hỗ trợ tốt hơn cho các binary Swift Syntax được xây dựng sẵn trong các thư viện macro được chia sẻ.

V. Tổng Kết

Swift 6.3 và 6.4 cùng nhau kể một câu chuyện rõ ràng: ngôn ngữ đang trưởng thành và đội ngũ phát triển nhận thức được điều đó. Những nỗ lực về tính tiện dụng – như anyAppleOS, cải thiện các hàm khởi tạo thành viên, chẩn đoán đồng bộ tốt hơn – đã loại bỏ những rắc rối đã tích tụ trong nhiều năm. Động thái đẩy mạnh đa nền tảng, với một SDK Android chính thức và việc tiếp tục đầu tư vào Embedded Swift, phản ánh một cam kết chân thành đối với Swift bên ngoài hệ sinh thái Apple. Đây là một bước tiến lớn, hứa hẹn một tương lai tươi sáng và rộng mở hơn cho Swift trong thế giới lập trình.

Chỉ mục