Cũng phải rất lâu rồi từ lần cuối mình ngồi viết như thế này :( Cũng vì trăm thứ công việc trên trời dưới đất (tasks, projects, R&D này nọ)… Hưmmm thiệt ra chủ yếu là do mình lười vl :)) Bài viết hôm nay thì cũng là do tình cờ mình nghĩ ra ngay trong lúc đang làm việc, thành ra cũng vội viết cho xong chứ không để qua hôm sau thì lại lười rồi… lại thôi :( Thời gian gần đây mình làm việc khá nhiều với Swift, phải công nhận là Swift là ngôn ngữ hay, thông minh và vui vẻ. Nếu sau này có thời gian mình update thêm một số cái hay ho (hoặc mình nghĩ là hay ho :v) mình làm được với Swift, những thứ mà Objective-C không làm được hoặc có thể mà củ chuối tđn ý :3
Bài viết này cũng là cũng sẽ là một bài trong series “Coding with Swift" ❤. Thật sự thì cái này cũng chẳng có gì cao siêu, chắc sẽ là một bài ngắn ngắn vui vẻ.
Trong lúc code, chắc không ít lần bạn gặp một thể loại logic kiểu kiểu thế này:
guard string != “string1” && string != “string2” {
// Do something
}
Một cách tương tự có thể là
guard !(string == “string1” || string == “string2”) {
// Do something
}
Đây là một kiểu logic khá phổ biến và dễ thực hiện để loại bỏ các trường hợp không mong muốn… Đối với một số case gộp condition như ở trên thì ok, những đối với những điều kiện nhiều hơn, ví dụ như: string == "1" || string == "2" || string == "3" || string == "4"... (F**king long)
thì đúng là ác mộng. Nhìn dài dòng và rối rắm, khó quản lý (ví dụ trên là một ví dụ đơn giản nhất mình có thể nghĩ ra lúc này, chứ thực tế nhiều cái bede hơn 100 lần).
So…
protocol FckinEqualtable {
func equalToAll(_ array: [Self]) -> Bool
func equalToOne(_ array: [Self]) -> Bool
}
FckinEquatable
là thứ mình nghĩ ra để giải quyết vấn đề trên, cook từ protocol Equatable. (Tại chưa biết phải đặt tên sao nên cứ để đại vậy :v).
Lại thêm một lần nữa mình yêu Swift với POP (Protocol-Oriented Programming). Để protocol này được generic và reuse thì mình viết thêm một extension cho nó. ❤ ❤ ❤
Công việc bây giờ chỉ là sử dụng:
extension String: FckinEqualtable { }
Và bạn đã có free-to-go FckinEquatable String :)) Cái đống condition loằng ngoằng ở trên sẽ được thay thế bằng
let array = ["string1", "string2", "string3"]
guard !str.equalToOne(array) {
// Do something
}
Nhìn cũng đẹp tương đối. Nhưng với một bước nâng cấp hơn để nhìn code có vẻ Swifty hơn thì chúng ta phải custom thêm một số operators.
infix operator =&=
infix operator =|=
=&=
sẽ tương đương với equalToAll
, =|=
sẽ tương ứng với equalToOne
Hihi đẹp trai hơn chút xíu rồi. And then,..
guard !(string =|= array) {
// Do something
}
Hix! Thiệt ra mình lười viết quá nên bài này có vẻ sơ sài :( Thôi thì mấy bạn đọc sơ qua code sample cũng như readme trên Github của mình vây…. Sorryy :’(
À mà cái này mình cũng code qua qua nên lỡ có gì sai sót mấy bạn cmt để mình sửa lại nhaaa. Thanks !!!!