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 maybeMonad, đá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ì fatalErrorcó loại () -> Never( ()là Void, loại đơn vị của Swift, Neverlà 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 Tdự 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ở Neverthà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) -> Tchữ 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()))?