Có một cách sử dụng mà tôi có thể nghĩ ra, và đó là thứ được coi là một cải tiến cho ngôn ngữ lập trình Swift.
Swift có một maybe
Monad, đánh vần Optional<T>
hoặc T?
. Có nhiều cách để tương tác với nó.
Bạn có thể sử dụng unrapping có điều kiện như
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
Bạn có thể sử dụng map
, flatMap
để chuyển đổi các giá trị
- Toán tử unsrap (
!
, loại (T?) -> T
) buộc mạnh mẽ mở khóa nội dung, nếu không sẽ gây ra sự cố
Toán tử hợp nhất nil ( ??
, thuộc loại (T?, T) -> T
) để lấy giá trị của nó hoặc sử dụng giá trị mặc định:
let someI = Optional(100)
print(someI ?? 123) => 100 // "left operand is non-nil, unwrap it.
let noneI: Int? = nil
print(noneI ?? 123) // => 123 // left operand is nil, take right operand, acts like a "default" value
Thật không may, không có cách nào ngắn gọn để nói "gỡ lỗi hoặc ném lỗi" hoặc "gỡ rối hoặc gặp sự cố với thông báo lỗi tùy chỉnh". Cái gì đó như
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
không biên dịch, vì fatalError
có loại () -> Never
( ()
là Void
, loại đơn vị của Swift, Never
là loại dưới cùng của Swift). Gọi nó là sản xuất Never
, không tương thích với T
dự kiến là toán hạng đúng của ??
.
Trong nỗ lực khắc phục vấn đề này, Swift Evolution propsoal SE-0217
- Nhà điều hành Unwrap hoặc Die Tiết đã được đưa ra. Cuối cùng nó đã bị từ chối , nhưng nó đã làm tăng sự quan tâm trong việc trở Never
thành một kiểu con của tất cả các loại.
Nếu Never
được tạo thành một kiểu con của tất cả các loại, thì ví dụ trước sẽ có thể biên dịch được:
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
bởi vì trang web của cuộc gọi ??
có loại (T?, Never) -> T
, sẽ tương thích với (T?, T) -> T
chữ ký của ??
.
(x ? 3 : throw new Exception())
được thay thế cho mục đích phân tích với một cái gì đó giống như(x ? 3 : absurd(throw new Exception()))
?