Các toán tử ++ và -- bị deprecate
Deprecate ở đây nghĩa là vẫn dùng được nhưng khi dùng thị nhận được warning từ Xcode. Các toán tử trên sẽ bị loại bỏ hoàn toàn ở Swift 3.0. Vì vậy thay vì ++ hay -- thì ta sẽ viết += 1 hay -= 1. Các lý do để tạo nên sự thay đổi này:
Viết ++ hay -- không ngắn hơn bao nhiêu so với += 1 hay -= 1
Viết ++ hay -- sẽ có ý nghĩa khác nhau khi là tiền tố hay hậu tố. Ví dụ:
var a = 5 let b = a++ // b = 5 let c = ++a // c = 7 var d = 5 let e = d-- // e = 5 let f = --d // f = 3
Trường hợp ++ hay -- là hậu tố của variable, phép toán sẽ trả về một bản copy giá trị của variable trước khi thực hiện thay đổi giá trị của variable (post-increment/post-decrement). Còn trong trường hợp là tiền tố, phép toán sẽ trả về giá trị thực của variable sau khi tính toán (pre-increment/pre-decrement). Ít người biết được điều này nên dễ gây ra nhầm lẫn => Loại bỏ
C-style for loop bị deprecate
Vì ++ và -- bị deprecate mà chúng hay được dùng trong C-style for loop => deprecate. Một số ứng viên thay thế:
for i in 1...10 { print(i) }
Nếu muốn loop ngược, thì đừng viết:
for i in 10...1 { print(i) }
for i in (1...10).reverse() { print(i) }
Fast enumeration của array:
var array = Array(1...10) for number in array { print(number) }
Array có thêm method removeFirst
Swift 2.2 thêm vào method removeFirst giúp xóa phần tử đầu tiên của một array và trả về phần tử đã xóa. Lưu ý là nếu gọi removeFirst từ một empty array, nó sẽ gây ra crash.
Cho phép so sánh trực tiếp 2 tuple
let hai = ("TuanHai", 25) let duc = ("Minh Duc", 24)
Trước Swift 2.2, ta phải viết một method như sau để so sánh 2 tuple trên:
func == (t1: (T, T), t2: (T, T)) -> Bool { return t1.0 == t2.0 && t1.1 == t2.1 }
Phải viết đoạn code như vậy thật dài dòng và dĩ nhiên nó chỉ so sánh được 2 tuple có 2 phần tử. Với Swift 2.2, ta có thể trực tiếp so sánh 2 tuple trên với toán tử ==:
if hai == duc { print("Matching tuple") }else { print("Not matching tuple") }
Swift 2.2 cho phép so sánh 2 tuple với cao nhất là 6 phần tử. Có 2 lý do để Apple hạn chế số phần tử là 6:
Càng nhiều phần tử cần so sánh => cần nhiều code hơn trong Swift Standard Library
Sử dụng tuple với nhiều hơn 6 phần tử có lẽ là một "code smell" và bạn nên chuyển sang dùng struct để thay thế.
Tuple splat syntax bị deprecate
Tuple splat là một cú pháp cho phép sử dụng một tuple làm argument của một method nếu thỏa mãn các điều kiện sau:
Các phần tử của tuple được đặt label và các label đó lần lượt trùng với label của các argument của method
Phần tử đầu tiên của tuple không được đặt label
Các kiểu của các phần tử của tuple cần lần lươt trùng với kiểu của các argument của method
func printNameAndAge(name: String, age: Int) { print("\(name) is \(age) years old") } let hai = ("Tuan Hai", 25) printNameAndAge(hai)
Đây là một cú pháp mà ít người biết tới và sử dụng tới và có thể gây "bối rối" khi đọc code, vì thế nó sẽ bị deprecate trong Swift 2.2 và loại bỏ hoàn toàn trong tương lai.
var argument bị deprecate
Mặc định, một method argument là một constant, không thể bị mutate trong method. Nếu muốn mutate một argument, ta thêm từ khóa var vào trước method argument. Ví dụ:
func changeCase(var name: String) { name = name.uppercaseString print(name) } changeCase("tuan hai")
var argument thường bị nhầm lẫn với inout argument vì thế nó bị deprecate. Sự khác biệt của chúng là var argument cho phép thay đổi giá trị của argument trong scope của method nhưng vẫn giữ nguyên giá trị của argument bên ngoài scope của method trong khi inout thì vẫn giữ nguyên giá trị sau khi thay đổi của argument bên ngoài scope của method.
Để thay thế var argument ở ví dụ trên, ta đơn giản là thêm vào một bản copy của argument như sau:
func changeCase(name: String) { let upperName = name.uppercaseString print(upperName) } changeCase("tuan hai")
Đổi tên các debug indentifiers
Swift 2.1 và các version trước đó sử dụng các symbol: __FILE__, __LINE__, __COLUMN__, __FUNCTION__, __DSO_HANDLE để debug. Với Swift 2.2, các symbol trên được đổi tên lần lượt thành #file, #line, #column, #function, #dsohandle.
Stringified selector bị deprecate
Trước Swift 2.2, một selector có thể được viết bằng một String như sau:
let barButton = UIBarButtonItem(title: "Tap!", style: .Plain, target: self, action: "buttonTaped")
Nếu để ý kỹ, buttonTaped không phải là một selector chuẩn mà phải là buttonTapped. Nhưng Xcode đã không phát hiện được lỗi này cho ta vì thế khi chạy sẽ bị crash.
Với Swift 2.2, sử dụng String cho một selector đã bị deprecate, thay vào đó ta sẽ viết #selector(buttonTapped) trong đoạn code ở trên. Nếu lỡ viết sai tên selector, ta sẽ nhận được một compile time error để sửa ngay.
Kiểm tra phiên bản swift đang chạy
#if swift(>=2.2) print("Running Swift 2.2 or later") #else print("Running Swift 2.1 or earlier") #endif
Các từ khóa mới dùng cho việc viết documentation
Swift hỗ trợ sử dụng markdown syntax để thêm meta-data vào code, vì thế ta có thể viết như sau:
/** Say hello to a specific person - parameters: - name: The name of the person to greet - returns: Absolutely nothing - authors: Paul Hudson Bilbo Baggins - bug: This is a deeply dull function */ func sayHello(name: String) { print("Hello, \(name)!") } sayHello("Bob")
Meta-data của method sayHello ở trên được dùng trong code completion. Ở ví dụ trên sử dụng các từ khóa như parameters, name, returns, author. Swift 2.2 bổ xung thêm các từ khóa: recommended, recommendedover, keyword. Từ khóa recommended dùng để khuyên người dùng nên sử dụng một method khác, còn từ khóa recommendedover dùng để khuyên người dùng sử dụng method đang dùng hơn là một method khác. Ví dụ:
/** Say hi to named person - recommendedover: sayHiToTuanHai - keyword: hi */ func sayHi(name: String) { } /** Say hi to Tuan Hai - recommended: sayHi */ func sayHiToTuanHai { }