Menu
CoddyTech

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 // 0

Kế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.

challenge icon

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 .bad khi không thể phân tích s thành Int, 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
3

Tự 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
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Swift