try? và try!
Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 46 trên 56.
Đôi khi bạn không quan tâm hàm đã gây ra lỗi nào, bạn chỉ muốn nhận kết quả hoặc giá trị dự phòng. Swift cung cấp cho bạn hai dạng viết ngắn.
try? biến mọi lỗi được ném ra thành nil. Kết quả là một Optional có kiểu trả về của hàm:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Kết hợp nó với ?? để đặt giá trị mặc định ngay trong biểu thức. Đây là cách ngắn nhất để nói “gọi thứ này và cho mình một giá trị trong mọi trường hợp”.
try! có nghĩa là “Mình biết lệnh này sẽ không gây ra ngoại lệ”. Nếu ngoại lệ xảy ra, chương trình sẽ gặp sự cố. Chỉ dùng nó khi bạn có thể chứng minh lệnh gọi đó an toàn; trong code thông thường, hãy ưu tiên try? kèm phương án dự phòng hoặc dùng đầy đủ do/catch.
Thử thách
DễĐịnh nghĩa NumError: Error với một trường hợp bad. Định nghĩa hàm parseEven(_ s: String) throws -> Int có thể ném ngoại lệ, hàm này:
- Ném
.badkhi không thể phân tíchsthànhInt, hoặc khi giá trị đã phân tích là số lẻ - Nếu không thì trả về số nguyên đã phân tích
Đọc một dòng đầu vào: một danh sách chuỗi được phân tách bằng dấu phẩy. Với mỗi chuỗi, dùng try? theo sau là ?? -1 để lấy số nguyên chẵn đã phân tích hoặc -1.
In ra các số nguyên thu được theo thứ tự, nối với ,. Sau đó, in ra ở dòng thứ hai số lượng giá trị được trả về là -1.
Với đầu vào 4,7,abc,8,11,2, đầu ra là:
4,-1,-1,8,-1,2
3Tự làm thử
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// Với mỗi phần tử, (try? parseEven(part)) ?? -1
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng thực thi
1Chuỗi chuyên sâu
Đếm và chỉ sốChữ hoa, chữ thường và xóa khoảng trắngTìm kiếm trong chuỗiTách và nối chuỗiThay thế chuỗi conÔn tập: Kiểm tra tên người dùng4Tập hợp
Tạo tập hợpPhép hợp và phép giaoPhép trừ và hiệu đối xứngTập con và tập hợp conÔn tập: Bộ lọc thẻ7Dự án: Theo dõi thói quen
Tổng quan dự ánĐánh dấu hoàn thành10Dự án: bộ máy trắc nghiệm
Tổng quan dự ánĐặt câu hỏiTự luyện tập: Playground Swift