Có gì mới ở Swift 2.0
Như chúng ta đã biết, trong hội nghị các nhà phát triển của Apple vừa rồi, Swift đã chính thức được công bố trở thành một ngôn ngữ mã nguồn mở. Kèm theo đó là một loạt các tính năng mới đối với ngôn ngữ này. ** I. Error Handling: ** Nếu như trong các phiên bản trước đó của Objective-C và Swift ...
Như chúng ta đã biết, trong hội nghị các nhà phát triển của Apple vừa rồi, Swift đã chính thức được công bố trở thành một ngôn ngữ mã nguồn mở. Kèm theo đó là một loạt các tính năng mới đối với ngôn ngữ này.
** I. Error Handling: **
Nếu như trong các phiên bản trước đó của Objective-C và Swift 1.0, để xử lí các ngoại lệ, chúng ta viện tới đối tượng NSError. Những dòng code như thế này có lẽ đã rất quen thuộc với chúng ta :
if drinkWithError(nil) { print("Could not drink beer! :[") return }
Bình thường thì, bạn sẽ truyền một con trỏ của đối tượng NSError (inout parameter trong Swift) và sau đó phương thức/ hàm sẽ assign con trỏ đó nếu có vấn để xảy ra. Tuy nhiên, vấn đề ở đây là bạn có thể sẽ truyền vào một biến nil để bỏ qua các lỗi, hoặc tệ hơn là không bao giờ check lỗi đó
Đối với Swift 2.0, giờ chúng ta đã có một cách an toàn hơn để kiểm tra lỗi. Sử dụng throws để xác định xem hàm/phương thức nào có thể gây ra lỗi. Sau đó bạn chỉ cần do, try và catch để xử lí.
// 1 enum DrinkError: ErrorType { case NoBeerRemainingError } // 2 func drinkWithError() throws { if beer.isAvailable() { // party! } else { // 3 throw DrinkError.NoBeerRemainingError } } func tryToDrink() { // 4 do { try drinkWithError() } catch { print("Could not drink beer! :[") return } }
Có một vài điều đáng chú ý :
- Để tạo một Error, ta đơn giản chỉ cần tạo ra enum kiểu ErrorType
- Cần phải sử dụng throws để đánh dấu bất kì hàm nào có thể gây ra lỗi
- Thay vì sử dụng try , bạn có thể wrap code với do .
Chú pháp mới này thực sự rất dễ dùng. Bạn hãy enjoy nó nhé.
II. Binding
Đối với Swift 1.0, chúng ta có thể bind các biến như nhau :
if let pants = pants, frog = frog { // good stuff here! }
Như thế cũng tốt, tuy nhiên điều này ddoongf nghĩa với việc bạn sẽ phải chú ý tới các code blocks( đôi khi rất lằng nhằng ) trong khi điều kiện gây lỗi lại nằm ở ngoài. Với guard , vấn đề này hoàn toàn được giải quyết.
guard let pants = pants, frog = frog else { // sorry, no frog pants here :[ return }
Sử dụng guard nghĩa là bạn có thể optional binding ( hoặc bất kì tác vụ khác ) , đưa ra một code block sẽ được thực thi trong điều kiện if trả về false. Sau đó bạn có thể tiếp tục xử lí sau đó. Code của bạn sẽ rõ ràng hơn rất nhiều so với việc sử dụng if let để check.
III. Protocol Extensions Chúng ta đã có Object-oriented, Functional .. Điều thú vị tiếp theo mà Swift mang đến cho chúng ta là một ngôn ngữ protocol-oriented programming.
Đối với Swift 1, protocol tương tự như interface để tạo ra các biến, phương thức mà một class, struct, enum có thể sử dụng. Giờ ở Swift 2 bạn có thể extend các protocol và thêm vào default implement cho thuộc tính và phương thức. Bạn có thể sử dụng với class và struc, thêm vào phương thức mới cho String hoặc Array.
extension CustomStringConvertible { var shoutyDescription: String { return "(self.description.uppercaseString)!!!" } } let greetings = ["Hello", "Hi", "Yo yo yo"] // prints ["Hello", "Hi", "Yo yo yo"] print("(greetings.description)") // prints [HELLO, HI, YO YO YO]!!! print("(greetings.shoutyDescription)")
Chú ý là Printable protocol giờ được gọi là CustomStringConvertible. Với protocol extensions, bạn có thể mở rộng các hàm, class của hệ thống với các hàm của bản thân bạn. Với sức mạnh của protocol extensions, giờ bạn có thể có cả một set các phương thức của collection như map, filter, indexOf và nhiều hơn nữa.
let numbers = [1, 5, 6, 10, 16, 42, 45] // Swift 1 find(filter(map(numbers, { $0 * 2}), { $0 % 3 == 0 }), 90) // Swift 2 numbers.map { $0 * 2 }.filter { $0 % 3 == 0 }.indexOf(90) // returns 2
-> Ngoài ra còn rất nhiều điều thú vị khác đang chờ chúng tak hám phá. Cheer