Toán tử ba ngôi hay là syntax sugar
swift
57
Fun
9
hardcore
18
White

VietHQ viết ngày 06/11/2018

Tình huống

Hôm nay có chút buồn ngủ nên mình tạo động lực cho bản thân bằng cách tự làm thử toán tử ba ngôi trong swift. Đôi khi chơi theo kiểu hardcore cũng mang lại liều doping khá mạnh, giống như phê thuốc vầy :D.

Bình thường mình không dùng autoclosure vì thấy nó cũng không có gì đặc sắc, chỉ là syntax sugar. Áp dụng đúng chỗ thì ngon, áp dụng không đúng chỗ thì càng làm code khó hiểu. Đâu phải cứ ngắn là hay. Tuy nhiên ở tình huống này, không dùng sugar syntax thì không được. t.t

Code

Bình thường toán tử ba ngôi sẽ viết kiểu này

condition ? trueValue : failureValue

Ở trường hợp đơn giản nhất, điều kiện và các giá trị trong toán tử ba ngôi sẽ là value type. Tuy nhiên đời mà, mong muốn của bạn đâu chỉ dừng ở đó.

Thế nên đôi khi nó thành như này

<function return Bool> ? <function return trueValue> : <function return failureValue> 

Làm thế nào để có thể đáp ứng được cả 2 trường hợp trên chỉ với 1 cách duy nhất, swift có autoclosure. Xong vấn đề đầu tiên.

Vấn đề thứ hai, ở đây chúng ta có 2 toán tử "?"":" như vậy ta cần custom 2 toán tử mới và kết hợp chúng để có thể tạo hiệu ứng tương tự toán tử ba ngôi.

Ok, phân tích bài toán xong, đến giờ show code

precedencegroup MyBoolApplication {
    associativity: left
    higherThan: MyConditionApplication
}
infix operator <||>: MyBoolApplication
func <||><T>(lhs: @escaping @autoclosure ()-> T, rhs: @escaping @autoclosure () -> T) -> (Bool) -> T {
    return { condition in
        if condition {
            return lhs()
        } else {
            return rhs()
        }
    }
}

precedencegroup MyConditionApplication {
    associativity: left
}
infix operator <??> :MyConditionApplication
func <??><T>(lsh: @autoclosure () -> Bool, rhs: (Bool) -> T) -> T {
    return rhs(lsh())
}

let x = true <??> "true" <||> "false"

Tác dụng phụ

Bài này có tác dụng for fun là chính chứ toán tử ba ngôi đã có sẵn trong bản thân ngôn ngữ rồi. Tuy nhiên, nếu nó có ích cho mọi người thì mình cũng rất vui :D.

Have fun!

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

VietHQ

17 bài viết.
8 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 1
Giới thiệu Callback là kĩ thuật được ưa chuộng trong lập trình hiện nay. Ngặt nỗi, nếu sử dụng không khéo rất dễ xảy ra callback hell. Dưới con mắ...
VietHQ viết 2 năm trước
7 1
White
5 1
Thời gian đầu làm việc với objc mình khá băn khoăn trong việc sử dụng các thuộc tính trong property như strong, weak, copy, assign. Nhân lúc rảnh r...
VietHQ viết hơn 5 năm trước
5 1
White
5 0
1. Giới thiệu Từ hồi mới bắt đầu làm IOS, thằng nào cũng hỏi mình có biết sử dụng AFNetworking không? Khổ nỗi lúc đó, mình mới chuyển từ làm game ...
VietHQ viết hơn 3 năm trước
5 0
Bài viết liên quan
White
14 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 5 năm trước
14 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
17 bài viết.
8 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!