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.
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.
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) } }
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") }
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?
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
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.
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.
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.
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]
// 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: Techmaster
Nguồn bài viết: https://medium.com/ios-geek-community/10-tips-to-become-better-swift-developer-a7c2ab6fc0c2#.ekknew2zn
IT Software Engineer (Long Thanh IZ)
Công ty TNHH framas Korea Vina
Location: Đồng Nai
Salary: Competitive
FrontEnd Developer (ReactJS, VueJS, HTML)
Location: Hồ Chí Minh
Salary: 10 Mil - 16 Mil VND
Location: Hồ Chí Minh
Salary: Competitive
Tổng công ty Xây dựng số 1 – CTCP
Location: Hồ Chí Minh
Salary: Competitive
Mobile Developer Junior (Mạnh Flutter)
Công Ty Cổ Phần Phương Tiện Điện Thông Minh Selex
Location: Hà Nội
Salary: 800 - 1,500 USD
Junior Mobile Developer (Flutter)
Công Ty Cổ Phần Phương Tiện Điện Thông Minh Selex
Location: Hà Nội
Salary: 1,000 - 1,500 USD
Thực Tập Sinh Lập Trình - Intern Developer (Game Mobile)
CÔNG TY CỔ PHẦN CÔNG NGHỆ SKYBULL VIỆT NAM
Location: Hà Nội
Salary: Competitive
Location: Hồ Chí Minh
Salary: 1,800 - 2,500 USD
Location: Bình Dương
Salary: 15 Mil - 23 Mil VND
Senior Frontend Developer (React)
Location: Hồ Chí Minh
Salary: 1,000 - 3,000 USD