10 thủ thuật giúp lập trình tốt hơn với Swift
Bài đăng này đã không được cập nhật trong 7 năm
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