Hằng ngày khi nghiên cứu về Swift, chúng ta thường hay được biết đến những khái niệm như Closure, Extension, Functional Programming...Tuy nhiên việc đọc hiểu tính chất định nghĩa và cách ứng dụng chúng trong những project thực tế lại khác nhau, có rất nhiều người nắm rõ được định nghĩa, tính chất của chúng nhưng lại không thể áp dụng triệt để ngoài thực tế. 10 mẹo dưới đây sẽ giúp bạn có cách nhìn rõ ràng nhất về việc sử dụng những tính năng tuyệt vời trên của Swift trong việc tối ưu code của mình. Ở đây tôi mạn phép lược bớt phần định nghĩa, mà chỉ nêu lên ví dụ áp dụng của từng trường hợp.

1. Sử dụng Extension:

Ví dụ: Viết chương trình tính số bình phương của một số:

Code chuẩn:

func square(x: Int) -> Int { return x * x }
var squaredOFFive = square(x: 5)
square(x:squaredOFFive) // 625

Ở đây thay vì khai báo thêm một đối tượng squareOfFive làm cho khối code trở nên cồng kềnh hơn thì chúng ta có thể đóng gọi lại trong một Extension như sau:

extension Int { 
 var squared: Int { return self * self }
}
5.squared // 25
5.squared.squared // 625

Như các bạn đã thấy khối hàm trên đã trở nên gọn gàng và dễ quản lý hơn.

2) Generics

Ví dụ: In tất cả các phần tử trong mảng

var stringArray = ["Bob", "Bobby", "SangJoon"]
var intArray = [1, 3, 4, 5, 6]
var doubleArray = [1.0, 2.0, 3.0]
func printStringArray(a: [String]) { for s in a { print(s) } }
func printIntArray(a: [Int]) { for i in a { print(i) } }
func printDoubleArray(a: [Double]) {for d in a { print(d) } }

Quá nhiều hàm và biến thừa thãi, ở đây chúng ta chỉ việc khai báo một Generic Function như sau:

func printElementFromArray<T>(a: [T]) {
 for element in a { print(element) } }

3) Vòng lặp For và vòng lặp While

Ví dụ: In từ "Count" 5 lần

var i = 0
while 5 > i {
print("Count")
i += 1 }

Bạn tạo ra một biến đếm i để kiểm tra số lần chạy func print(), điếu đó đòng nghĩa với việc sẽ có nhiều biến -> sử dụng thêm nhiều bộ nhớ và dẫn đến nhiều vấn đề trong code. 

Do đó, sử dụng một vòng for đơn giản sẽ làm code trở nên tối ưu hơn nhiều:

for _ in 1...5 { print("Count") }

4) Optional Unwrapping

Ví dụ: Tạo một làm login cơ bản

var myUsername: Double?
var myPassword: Double?
// Hideous Code
func userLogIn() {
 if let username = myUsername {
  if let password = myPassword {
   print("Welcome, \(username)"!)
  }
 }
}

Có quá nhiều if trong khối lệnh trên, điều này là không hay chút nào, có thể bạn hiểu logic này nhưng người đi sau maintain sẽ rất khó khăn trong việc đọc hiểu logic của hàm trên.

func userLogIn() {
 guard let username = myUsername, let password = myPassword 
  else { return } 
 print("Welcome, \(username)!") }

Sự khác biệt là rất rõ ràng với guard let. Nếu username và password là nil thì khối lệnh trên sẽ thoát khỏi hàm bằng cách gọi return. Còn lại thì sẽ chạy hàm print ở dưới. Rất gọn gàng và dễ hiểu đúng không nào? 

5) Computed Property vs Function

Ví dụ:Tìm đường kính của một hình tròn

func getDiameter(radius: Double) -> Double { return radius * 2}
func getRadius(diameter: Double) -> Double { return diameter / 2}
getDiameter(radius: 10) // return 20
getRadius(diameter: 200) // return 100
getRadius(diameter: 600) // return 300

Ỏ đây chúng ta đã tạo ra quá nhiều mối liên kết giữa các hàm. Điều này là không nên vì nó sẽ làm luồng chạy của project trở nên hỗn loạn. Hãy làm chúng trở nên tách bạch và trong sáng hơn bằng cách sử dụng Computer Property:

var radius: Double = 10
var diameter: Double {
 get { return radius * 2}
 set { radius = newValue / 2} } 
radius // 10
diameter // 20
diameter = 1000 
radius // 500

6) Enum

Ví dụ: Viết hàm bán vé xem phim

switch person {
 case "Adult": print("Pay $7")
 case "Child": print("Pay $3")
 case "Senior": print("Pay $4")
 default: print("You alive, bruh?") }

Thay vì sử ngồi liệt kê hết mọi trường hợp như khối lệnh Switch trên thì chúng ta có thể dùng Enum để tối ưu hóa việc liệt kê các trường hợp 

enum People { case adult, child, senior }
var person = People.adult
switch person {
 case .adult: print("Pay $7")
 case .child: print("Pay $3")
 case .senior: print("Pay $4")
}

Bạn sẽ không phải ngồi gõ lần lượt từng trường hợp nữa, mà các trường hợp sẽ lần lượt được highlight ra cho bạn sau dấu ".". Một thay đổi nhỏ nhưng giúp bạn tiết kiệm được rát nhiều thời gian.

7) Nil Coalescing

Ví dụ: Viết hàm chọn theme color

var userChosenColor: String?

var defaultColor = "Red"

var colorToUse = ""

if let Color = userChosenColor { colorToUse = Color } else

 { colorToUse = defaultColor }

Quá dài, hãy gói gọn chúng thành một câu lệnh duy nhất như sau:

var colorToUse = userChosenColor ?? defaultColor

Nếu màu user chọn = nil thiì màu mặc định sẽ là defaultColor. Ngược lại, thì màu được chọn sẽ là màu của user.

8) Conditional Coalescing
 

var currentHeight = 185

var hasSpikyHair = true

var finalHeight = 0

if hasSpikyHair { finalHeight = currentHeight + 5}

 else { finalHeight = currentHeight }

Tương tự như ví dụ số 7, chúng ta thay khối lệnh if - else bằng một đoạn mã đơn giản và ngắn gọn hơn:

finalHeight = currentHeight + (hasSpikyHair ? 5: 0)

Nếu điều kiện hasSpiKy == True thì chúng ta thêm 5 vào biến finalHeigth, ngược lại thì + 0.

9) Functional Programming

Ví dụ: Tìm kiếm số chẵn trong dãy số từ 1 đến 10: 

//Code mẫu



var newEvens = [Int]()

for i in 1...10 {

 if i % 2 == 0 { newEvens.append(i) } }

print(newEvens) // [2, 4, 6, 8, 10]

Thay vì viết một đoạn logic như trên thì chúng ta hoàn toàn có thể sử dụng function độc lập cho case trên: 

var evens = Array(1...10).filter { $0 % 2 == 0 }

print(evens) // [2, 4, 6, 8, 10]

10) Sử dụng Closure

// Function bình thường

func sum(x: Int, y: Int) -> Int { return x + y }

var result = sum(x: 5, y: 6) // 11

Thay vì khai báo một function thì chúng ta có thể khai báo một biến và chứa trong đó một closure (block) thực thi logic trên

 

Nguồn bài viết: https://medium.com/ios-geek-community/10-tips-to-become-better-swift-developer-a7c2ab6fc0c2#.ekknew2zn