Upgrade code từ Swift 2.3 lên Swift 3.0

Mở đầu

Rồi 1 ngày đẹp trời, bạn mở project của bạn ra, lại thấy các dòng warning màu vàng với nội dung "Hãy convert sang Swift 3 đi, chúng tao sắp không còn support cho Swift 2 nữa rồi" ta lại chợt bồi hồi lo lắng. Với điểm 10 môn "Đạo đức nghề nghiệp", chúng ta lại vội vã suggest khách hàng update lên Swift 3 ngay, trước là để chúng ta update kiến thức bản thân, sau là để công ty có thêm cái mà deal giá với khách hàng. Dòng đời xô đẩy tôi phải cùng lúc upgrade lên Swift 3 cho cả 2 dự án. Với kinh nghiệm tự sửa gần 5000 dòng code và review gần 2000 dòng code khác, tôi cũng xin được viết lên đây đôi điều cần lưu ý 😄

Start

1. Update Project Setting

Khi sử dụng Xcode 8, Apple đã mặc định bắt chúng ta phải upgrade lên Swift 3.0. Nếu tại thời điểm đó, các lib mà bạn đang sử dụng còn chưa kịp update, hoặc bạn chưa có thời gian để làm việc đó, thì chúng ta có 1 option khác để sử dụng Swift 2.3 ngay trên Xcode 8. Khi bắt đầu lên Swift 3.0, việc đầu tiên bạn cần làm là hãy disable nó đi, để project của bạn sẵn sàng cho mọi thứ sắp tới

Target > Your Target name > Build Settings >
Use Legacy Swift Language Version -> No

2. Update opensource libs

Trong các dự án, việc sử dụng các lib opensource giúp chúng ta tiết kiệm được rất nhiều thời gian và công sức. Tuy vậy, điều đó cũng có nghĩa là bạn sẽ phải phụ thuộc vào người đã code ra những lib đó. Sẽ có 2 trường hợp xấu có thể xảy ra :

  1. Lib đó chưa được update lên Swift 3.0 Hãy research trước. Không chỉ có mình bạn đang sử dụng cái lib này. Sẽ có những người tiên phong, thay vì chờ đợi, họ fork repo lib này về và làm 1 bản update. Bạn có thể sử dụng nó, hoặc tự update theo cách riêng của bạn

  2. Lib đó đã update, nhưng quá trình Migrating sẽ tốn của bạn 1 khoảng thời gian không nhỏ. Một ví dụ đơn giản của trường hợp này là việc chúng ta sẽ update lên Alamofire 4 để dùng với Swift 3. Và nó sẽ không chỉ đơn giản là bạn chỉ cần update file pod là xong đâu (https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire 4.0 Migration Guide.md). Vậy nên, khi estimate, đừng quên check kỹ điều này. Nó có thể làm bạn tốn nhiều thời gian hơn bạn tưởng 😄

3. Update code

Đây sẽ chính là khoảng thời gian khủng bố tinh thần bạn. Khi bạn thử chạy Project, nó sẽ hiển thị nhẹ nhàng khoảng tầm 100 lỗi. Và khi bạn cố gắng fix 100 lỗi đó, nó sẽ thêm 100 lỗi khác, và cứ thế kéo dài vô tận.

Các lỗi thường gặp trong quá trình này

** 1. Lỗi cú pháp - Tên function/ Tên các enum đã bị thay đổi: (các function và enum của hệ thống) ** Đây là trường hợp fix lỗi dễ nhất, tất cả những gì bạn cần là công cụ Replace của Xcode. Sử dụng công cụ Replace sẽ giúp bạn 1 click có thể fix được cả 100 lỗi :DDD

Đừng quên đặt giới hạn search chỉ riêng cho project của bạn nhé.

*** Note *** Hãy đọc kỹ trước khi nhấn nút Replace All

** 2. Lỗi function name (các function do chính bạn code) ** Với 1 function được khai báo có dạng

func functionName(variable: Type) -> ReturnType

thì với Swift 2.3 bạn sẽ gọi function như sau

functionName(var)

thì trong Swift 3, bạn sẽ phải sửa nó thành

functionName(variable: var)

Nếu sửa ở chỗ gọi hàm, bạn sẽ tốn rất nhiều công sức, thay vì đó, hãy sửa luôn ở chính tại nơi khai báo hàm

func functionName(_ variable: Type) -> ReturnType

*** Note *** với những hàm IBOutlet bắt các action của button thì bạn cũng cần đổi tên function như trên, nếu không app sẽ bị crash

** 3. Một số lỗi thay đổi kiểu biến, kiểu optional, function đó không còn support trên Swift 3 nữa ** Những cái lỗi như này thì bạn hoàn toàn phải tự research, tùy theo từng lỗi mà bạn mắc phải. Hầu hết đều có những người tiền nhiệm đã đau đầu vì nó nên bạn cũng không cần phải care lắm. Tôi chỉ xin đưa ra 1 lỗi làm ví dụ là lỗi get tên class hoặc get class type của object không còn đc support trên Swift 2 nữa thì bạn có thể thay thế bằng cái này

    class var identifier: String {
        return String(describing: self)
    }
    
    var identifier: String {
        return String(describing: type(of: self))
    }

Kết

Trên đây chỉ là những thứ giúp cho project của bạn có thể build được, và không bị lỗi. Hãy check qua xem cách đặt tên function, đặt tên biến của bạn đã theo chuẩn như Apple đã suggest và đã làm với Swift 3 hay chưa. Code của bạn không chỉ chạy được, mà hãy tự upgrade mình lên như upgrade code của bạn vậy 😄. Và đừng quên fix tất cả các warning nữa nhé. Hãy làm sớm, đừng để đêm dài lắm mộng 😄