Ràng buộc tùy chọn
Swift 3 & 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Mã let booleanValue = booleanValue
trả về false
nếu booleanValue
có nil
và if
khối không thực thi. Nếu booleanValue
không nil
, mã này xác định một biến mới có tên booleanValue
kiểu Bool
(thay vì tùy chọn, Bool?
).
Mã Swift 3 & 4 booleanValue
(và mã Swift 2.2 where booleanValue
) đánh giá booleanValue: Bool
biến mới . Nếu đúng, if
khối sẽ thực thi với biến mới được xác định booleanValue: Bool
trong phạm vi (cho phép tùy chọn tham chiếu lại giá trị được ràng buộc trong if
khối).
Lưu ý: Đó là một quy ước Swift để đặt tên cho hằng / biến bị ràng buộc giống với hằng / biến tùy chọn chẳng hạn let booleanValue = booleanValue
. Kỹ thuật này được gọi là tạo bóng thay đổi . Bạn có thể phá vỡ quy ước và sử dụng một cái gì đó như thế let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Tôi chỉ ra điều này để giúp hiểu những gì đang xảy ra. Tôi khuyên bạn nên sử dụng bóng thay đổi.
Các cách tiếp cận khác
Nil kết hợp
Nil kết hợp là rõ ràng cho trường hợp cụ thể này
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Kiểm tra false
không rõ ràng
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Lưu ý: if !booleanValue ?? false
không biên dịch.
Buộc mở gói tùy chọn (tránh)
Buộc mở gói làm tăng khả năng ai đó sẽ thực hiện thay đổi trong tương lai mà biên dịch nhưng bị lỗi trong thời gian chạy. Do đó, tôi sẽ tránh những thứ như thế này:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Cách tiếp cận chung
Mặc dù câu hỏi tràn ngăn xếp này hỏi cụ thể cách kiểm tra xem a Bool?
có true
nằm trong một if
câu lệnh hay không, nhưng sẽ rất hữu ích khi xác định một cách tiếp cận chung cho dù kiểm tra đúng, sai hoặc kết hợp giá trị không được bao bọc với các biểu thức khác.
Khi biểu thức trở nên phức tạp hơn, tôi thấy cách tiếp cận ràng buộc tùy chọn linh hoạt hơn và dễ hiểu hơn các cách tiếp cận khác. Lưu ý rằng công trình ràng buộc bắt buộc với bất kỳ loại tùy chọn ( Int?
, String?
, vv).