Những điểm mới trong Swift 3 (phần 2)
GCD và Core Graphics được hiện đại hóa GCD và Core Graphics đều có những thay đổi cần thiết liên quan đến các API holdouts cũ Grand Central Dispatch được sử dụng cho các nhiệm vụ đa luồng như tính toán hoặc giao tiếp với server. Bằng cách di chuyển hoạt động đến luồng khác, ...
GCD và Core Graphics được hiện đại hóa
GCD và Core Graphics đều có những thay đổi cần thiết liên quan đến các API holdouts cũ
Grand Central Dispatch được sử dụng cho các nhiệm vụ đa luồng như tính toán hoặc giao tiếp với server. Bằng cách di chuyển hoạt động đến luồng khác, bạn ngăn việc khóa giao diện người dùng. Thư viện libdispatch được viết bằng ngôn ngữ C và luôn sử dụng API ngôn ngữ C. API hiện tại đã được viết lại bằng Swift nguyên bản [SE-0088]:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// old way, Swift 2 let queue = dispatch_queue_create("com.test.myqueue", nil) dispatch_async(queue) { print("Hello World") } // new way, Swift 3 let queue = DispatchQueue(label: "com.test.myqueue") queue.async { print("Hello World") } |
Tương tự, Core Graphics được viết bằng ngôn ngữ C và trong quá khứ sử dụng các calls 1 cách cứng nhắc. Và đây chính là bộ mặt mới [SE-0044]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// old way, Swift 2 let ctx = UIGraphicsGetCurrentContext() let rectangle = CGRect(x: 0, y: 0, awidth: 512, height: 512) CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor) CGContextSetStrokeColorWithColor(ctx, UIColor.whiteColor().CGColor) CGContextSetLineWidth(ctx, 10) CGContextAddRect(ctx, rectangle) CGContextDrawPath(ctx, .FillStroke) UIGraphicsEndImageContext() // new way, Swift 3 if let ctx = UIGraphicsGetCurrentContext() { let rectangle = CGRect(x: 0, y: 0, awidth: 512, height: 512) ctx.setFillColor(UIColor.blue().cgColor) ctx.setStrokeColor(UIColor.white().cgColor) ctx.setLineWidth(10) ctx.addRect(rectangle) ctx.drawPath(using: .fillStroke) UIGraphicsEndImageContext() } |
Viết hoa các trường hợp đếm
Đối nghịch với cách code Swift, lowerCamelCase hiện đã thay thế cho nhiều trường hợp đếm, giúp chúng đồng nhất hơn với các thuộc tính khác – hoặc các giá trị [SE-0006]:
1 2 3 4 5 6 7 8 9 10 11 |
// old way, Swift 2, followed by new way, Swift 3 UIInterfaceOrientationMask.Landscape UIInterfaceOrientationMask.landscape NSTextAlignment.Right NSTextAlignment.right SKBlendMode.Multiply SKBlendMode.multiply |
UpperCamelCase hiện được dùng riêng cho tên của các types và các protocols. Tuy tốn 1 khoản thời gian để làm quen, nhưng đội ngũ Swift có lý do để tìm kiếm sự ổn định thống nhất.
Các methods return hoặc điều chỉnh
Thư viện chuẩn cũng thống nhất hơn trong việc đặt tên method với động từ và danh từ. Bạn chọn 1 tên, dựa trên các hiệu ứng phụ hoặc các hành động đã thực hiện. Nguyên tắc ngón cái là nếu nó bao gồm hậu tố như “-ed” hoặc “-ing” thì method được hiểu là danh từ. Một danh từ method trả lại 1 giá trị. Nếu không có hậu tố, thì nó có khả năng là động từ bắt buộc. Những “động từ” methods này thực hiện hành động trong bộ nhớ tham chiếu. Điều này được hiểu là điều chỉnh tại chỗ. Có rất nhiều cặp methods đi theo quy ước danh từ/ động từ này. Và đây là 1 trong số chúng [SE-0006]:
1 2 3 4 5 6 7 8 9 10 |
customArray.enumerate() customArray.enumerated() customArray.reverse() customArray.reversed() customArray.sort() // changed from .sortInPlace() customArray.sorted() |
Đây là đoạn trích trong hành động:
1 2 3 4 5 6 7 8 |
var ages = [21, 10, 2] // variable, not constant, so you can modify it ages.sort() // modified in place, value now [2, 10, 21] for (index, age) in ages.enumerated() { // "-ed" noun returns a copy print("(index). (age)") // 1. 2
2. 10
3. 21 } |
Các loại hàm
Các khai báo hàm và các hàm calls luôn yêu cầu các dấu ngoặc quanh các parameter
1 2 3 4 5 |
func f(a: Int) { ... } f(5) |
Tuy nhiên, khi bạn sử dụng 1 hàm type như chính parameter, bạn có thể viết như thế này:
1 2 3 |
func g(a: Int -> Int) -> Int -> Int { ... } // old way, Swift 2 |
Nếu chú ý, bạn sẽ thấy nó khá là khó đọc. Vậy, các parameter kết thúc và các hàm return bắt đầu khi nào? Với Swift 3, cách tốt để định nghĩa hàm này là [SE-0066]:
1 2 3 |
func g(a: (Int) -> Int) -> (Int) -> Int { ... } // new way, Swift 3 |
Hiện tại, danh sách parameter đã được bao quanh bởi các dấu ngoặc và theo dõi bởi hàm return. Mọi thứ trở nên rõ ràng hơn và hệ quả là, dễ nhận dạng hàm type hơn. Dưới đây là so sánh mạnh mẽ hơn:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// old way, Swift 2 Int -> Float String -> Int T -> U Int -> Float -> String // new way, Swift 3 (Int) -> Float (String) -> Int (T) -> U (Int) -> (Float) -> String |
5. Các bổ sung API
Trong khi cập nhật lớn nhất đối với Swift 3 là hiện đại hóa APIs hiện tại, vẫn còn nhiều thứ mà cộng đồng Swift đang chăm chỉ làm – đó là những bổ sung hữu ích đến Swift API.
Tiếp cận Containing Type
Khi bạn nhận dạng thuộc tính tĩnh hoặc method, bạn đã luôn gọi chúng trên type 1 cách trực tiếp:
1 2 3 |
CustomStruct.staticMethod() |
Đây là cách hoạt động của nó [SE-0068]:
1 2 3 4 5 6 7 8 9 10 11 12 |
struct CustomStruct { static func staticMethod() { ... } func instanceMethod() { Self.staticMethod() // in the body of the type } } let customStruct = CustomStruct() customStruct.Self.staticMethod() // on an instance of the type |
1 2 3 4 5 |
for view in sequence(first: someView, next: { $0.superview }) { // someView, someView.superview, someView.superview.superview, ... } |
1 2 3 4 5 |
for x in sequence(first: 0.1, next: { $0 * 2 }).prefix(while: { $0 < 4 }) { // 0.1, 0.2, 0.4, 0.8, 1.6, 3.2 } |
- #keyPath() hoạt động như #selector() và hỗ trợ bạn hạn chế các lỗi chính tả trong API kiểu dãy
- Bạn có thể gọi pi theo type mà bạn dự định sử dụng như: Float.pi, CGFloat.pi. Và hầu hết thời gian compiler có thể suy luận kiểu: let circumference = 2 * .pi * radius [SE-0067]
- Prefix NS đã bị loại trừ trong các foundation types cũ, bạn có thể sử dụng Calendar, Date thay vìNSCalendar và NSDate.
Những bổ sung đến tooling
Swift là 1 ngôn ngữ và 1 phần lớn của việc viết Swift liên quan đến sử dụng môi trường lập trình – chính là Xcode! Các thay đổi đang diễn ra với tooling sẽ ảnh hưởng cách bạn viết Swift mỗi ngày. Swift 3 sửa các bugs trong compiler và các tính năng IDE. Nó cũng tăng mức độ chính xác của tin nhắn báo cáo và lỗi. Và như bạn mong đợi, với mỗi lần ra mắt, Swift chạy và tổng hợp nhanh hơn:
- Bằng cách tăng hashing dãy, đã tăng tốc độ của từ điển của dãy lên 3 lần
- Bằng cách di chuyển các đối tượng từ bộ nhớ heap đến bộ nhớ stack, đã tăng tốc độ lên 24 lần (trong 1 số trường hợp)
- Hiện nay complier các file cùng 1 lúc (khi thực hiện tối ưu hóa toàn bộ module)
- Tối ưu hóa kích cỡ code đã làm giảm kích thước được tổng hợp của code Swift. Bản demo của Apple Demobots đã giảm kích thước được tổng hợp đến 77% so với bản gốc.
Xcode cũng đang học cách suy nghĩ theo Swift nguyên bản:
- Khi bạn click chuột phải vào 1 method API như sort() và nhảy đến định nghĩa của nó, trước đây bạn thường bị đưa đến 1 tập tin tiêu đề khó hiểu. Hiện tại, trong Xcode 8, bạn thấy rằng sort() là 1 extension đến Array như bạn mong đợi.
- Swift Snapshots giống như những phiên bản ra đời hằng đêm của Swift Evolution. Nó đem đến cơ hội làm việc với syntax mới trước khi hoàn toàn bị “nướng” trong Xcode. Xcode 8 có thể tải và chạy Swift Snapshots trong playgrounds.
Swift Package Manager
Nguồn mở Swift là 1 tập thể các kho lưu trữ, gồm ngôn ngữ, thư viện cốt lõi và quản lý gói. Điều này cấu thành nên những gì chúng ta nghĩ về Swift. Swift Package Manager định nghĩa cấu trúc danh mục đơn giản của bất kì code Swift nào mà bạn chia sẻ và nhập vào các projects. Tương tự các quản lý gói, bạn có lẽ quen thuộc với Cocoapods hoặc Carthage, các quản lý gói của Swift sẽ tải các dependencies, tổ hợp chúng và liên kết chúng với nhau để tạo các thư viện và các executables. Swift 3 là phiên bản ra đời đầu tiên bao gồm cả Swift Package Manager. Có 1000 thư viện đã hỗ trợ chúng và trong những tháng tới, bạn sẽ thấy nhiều hơn các thư viên được format cho Swift Package Manager.
Các tính năng dự định trong tương lai
Trước đây, Swift 3 từng được đề cập với mục tiêu giúp dev giữa code qua các phiên bản trong tương lai bằng cách nỗ lực để tránh các thay đổi lớn. Tuy điều đó đúng, vẫn có 1 số loftier, những mục tiêu liên quan chưa đạt được trong phiên bản lần này, các bổ sung generics cụ thể và độ ổn định của Application Binary Interface (ABI). Các bổ sung generics sẽ bao gồm các ràng buộc protocol đệ quy và khả năng để khiến 1 extension đã bị ràng buộc tương thích với 1 protocol mới (như mảng của các yếu tố Equatable là Equatable). Trước khi các tính năng này được hoàn thiện, Swift không thể tuyên bố tính ổn định của ABI. Ổn định hóa ABI sẽ cho phép các ứng dụng và thư viện tổ hợp với các phiên bản khác của Swift để có thể được liên kết và tương tác với nhau. Đây là bước quan trọng cho các thư viện thứ ba để chuyển các frameworks mà không cung cấp source code khi các phiên bản mới của Swift khôn chỉ yêu cầu chúng cập nhật code mà còn dựng lại các frameworks. Ngoài ra, tính ổn định của ABI sẽ loại bỏ nhu cầu chuyển thư viện chuẩn Swift kèm với các tập tin nhị phân, khi đây hiện là trường hợp với các app iOS và macOS tạo với Xcode. Hiện tại, các tập tin nhị phân được kết hợp với kích cỡ file thêm là 2MB, đảm bảo chúng sẽ chạy trong các hệ thống vận hành tương lai. Kết luận lại, bạn có thể giữ code qua các phiên bản, nhưng tính tương thích của tập nhị phân được kết hợp qua các phiên bản thì vẫn chưa đạt được.
Từ đây, chúng ta sẽ đi đến đâu?
Swift tiếp tục phát triển như cộng đồng tập trung các practices tốt nhất. Mặc dù vẫn còn đang trong giai đoạn ý tưởng, Swift đã có đà và 1 tương lai rộng mở. Swift đã chạy trên Linux, và bạn có khả năng thấy chúng chạy trên các server, bên cạnh các thiết bị trong những năm tới. Thiết kế 1 ngôn ngữ từ lúc khởi đầu có những lợi thế riêng, khi cơ hội để phá vỡ tính ổn định của ABI khi nó đã bị khóa là rất hiếm. Đây là cơ hội duy nhất đế ngôn ngữ trở nên chính xác hơn.
Swift cũng đang mở rộng tầm tiếp cận. Apple đang sử dụng chính sản phẩm của mình để chứng minh các tính năng, ưu điểm của sản phẩm. Đội ngũ ở Apple sử dụng Swift trong các app Music, Consol, ảnh-trong-ảnh trong Sierra, xem Xcode Documentation và app Swift Playgrounds dành cho iPad.
Có 1 sự thúc đẩy lớn những người chưa là lập trình viện học ngôn ngữ Swift, cả trên iPad và thông qua các đề xuất liên quan đến giáo dục.
Swift vẫn tiếp tục cải tiến: những cái tên tốt hơn, code đọc rõ hơn và bạn có những công cụ để xác nhập. Nếu bạn được truyền cảm ứng đào sâu nghiên cứu hơn, bạn có thể xem WWDC session videos.
Chắc chắn sẽ còn nhiều điều nữa khi Swift 3 được chốt hạ vào cuối năm 2016. Chúng ta sẽ tiếp tục theo dõi các cập nhật ở đây, nên các dev hãy xem các hướng dẫn, các thông báo sách và videos khi bắt đầu sử dụng các thay đổi thú vị này nhé.
Theo bạn, phần nào của Swift 3 là thú vị nhất?
Techtalk via IDE Academy via raywenderlich