10 thủ thuật giúp lập trình tốt hơn với Swift

Swift được giới thiệu lần đầu tiên ở WWDC ( Worldwide Developers Conference) vào năm 2014, và từ đó tới nay nó đã dần thay thế Objective-C trong việc phát triển các ứng dụng cho thiết bị của Apple. Và chắc hẳn bất cứ lập trình viên IOS nào cũng gặp phải những khó khăn khi mới sử dụng Swift. Vậy nên sau đây mình xin giới thiệu 10 mẹo nhỏ để giúp bạn lập trình tốt hơn với Swift

1. Extension

Ví dụ bạn có 1 hàmhàm tính bình phương như sau

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

Viết như trên thì sẽ có thêm 1 biến không cần thiết trong hàm của chúng ta. Ta có thể viết thêm 1 Extension như sau:

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

2. Generics

Để in tất cả phần tử trong 1 mảng bạn sẽ làm như sau

// Bad Code
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) } }

Cần quá nhiều phương thức cho 1 chức năng đơn giản. Hãy đơn giản hoá chúng bằng Generic

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

3. Vòng lặp for và While

VD: In từ "Count" 5 lần

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

cần có biến i để không in quá 5 lần. Hãy dùng cách khác tốt hơn mà vẫn đảm bảo đc hiệu quả

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

4. Dùng Guard

VD về Guard let và if let

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

Bạn đã bao giờ viết những lệnh if lồng if? Thật sự là nó qua khủng khiếp, dài dòng và nhìn thôi cũng thấy đáng sợ rồi Vậy hãy làm cho nó tốt hơn bằng việc dùng guard let

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

với guard let, nếu username và password có giá trị nil thì nó sẽ return luôn, nếu không thì sẽ print ra như bình thường. Bạn thấy chúng tốt hơn rất nhiều rồi đúng không!

5. Dùng khởi tạo để tính luôn giá trị

// 💩 Code
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

Bạn tạo 2 function được tạo riêng để tính bán kính và đường kính. Thật tệ và tôi có cách tốt hơn cho bạn

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

6. Kiểu Enum

Mình đà từng thấy khó chịu với kiểu Enum, nhưng khi đã quen với nó rồi thì câu chuyện sẽ rất khác đó VD: Bán vé :

// Simply Bad

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

bạn vẫn hay code như thế này phải không? Nhưng với Enum ta sẽ code thế này:

// Beautiful Code
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")
}

7. Nil Coalescing Oparatior

Để chọn mà cho Twitter bạn sẽ phải code

// Long Code
var userChosenColor: String? 
var defaultColor = "Red"
var colorToUse = ""
if let Color = userChosenColor { colorToUse = Color } else
 { colorToUse = defaultColor }

Quá dài, với Nil Coalesing Oparation nó sẽ ngắn và đẹp hơn nhiều var colorToUse = useChosenColor ?? defaultColor

8. Coditional Coalescing

VD:

var currentHeight = 185
var hasSpikyHair = true
var finalHeight = 0
if hasSpikyHair { finalHeight = currentHeight + 5} 
else { finalHeight = currentHeight }

Vân quá dài

finalHeight = currentHeight + (hasSpikyHair ? 5: 0)

9. Lập trình chức năng

VD: // Imperative (a.k.a boring)

var newEvens = [Int]()
for i in 1...10 {
 if i % 2 == 0 { newEvens.append(i) } }
print(newEvens) // [2, 4, 6, 8, 10]

Nhưng chúng ta không cần lấy ra hết các phần từ trong mảng. Vậy nên ta làm như sau

var evens = Array(1...10).filter { $0 % 2 == 0 } 
print(evens) // [2, 4, 6, 8, 10] 

10. Closure với function

VD:

// Normal Function 
func sum(x: Int, y: Int) -> Int { return x + y }
var result = sum(x: 5, y: 6) // 11

Bạn thấy đấy, ta không cần thêm tài nguyên cho một biến result không cần thiết. Vậy hãy dùng Closure

// Closure
var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
sumUsingClosure(5, 6) // 11 

Bạn thấy đấy, Swift cũng đầy thú vị và hữu ích phải không nào. Hy vọng bài viết có thể giúp ích phần nào cho những bạn đang gặp khó khăn


All Rights Reserved