2014-11-13 14 views
8

Tôi đang tìm kiếm một cách để đánh giá một Swift Bool ngắn gọn trong một if tuyên bố duy nhất, khi Bool là tài sản của một đối tượng không bắt buộc:Đánh giá tài sản của đối tượng không bắt buộc Bool trong câu lệnh if

var objectWithBool: ClassWithBool? 
// ... 

if let obj = objectWithBool { 
    if obj.bool { 
     // bool == true 
    } else { 
     // bool == false 
    } 
} else { 
    // objectWithBool == nil 
} 

Có cách nào để kết hợp các câu lệnh if này? Trong Objective-C này có thể dễ dàng được thực hiện, như một đối tượng nil thể được đánh giá trong cùng một biểu:

if (objectWithBool.bool) { 
    // bool == true 
} else { 
    // bool == false || objectWithBool == nil 
} 

Trả lời

14

Ah, tìm thấy nó:

if objectWithBool?.bool == true { 
    // objectWithBool != nil && bool == true 
} else { 
    // objectWithBool == nil || bool == false 
} 

Khái niệm chaining tùy chọn objectWithBool?.bool trả về một tùy chọn Bool . Vì nó là không bắt buộc, mà biểu hiện một mình trong báo cáo kết quả if sẽ được đánh giá để true/false dựa vào việc bắt buộc chứa một giá trị hay không.

Bằng việc sử dụng các nhà điều hành == báo cáo kết quả kiểm tra if giá trị của tùy chọn, mà trong trường hợp này có thể true, false, hoặc nil.

+0

Tôi sẽ không nói rằng nó *" buộc Bool tùy chọn được đánh giá "*. 'objectWithBool? .bool' có thể là' true', 'false' hoặc' nil' ('== Tùy chọn . Không ') và so sánh' == true' chỉ tạo ra 'true' chỉ trong trường hợp đầu tiên. –

+1

@MartinR Đúng, tôi hơi vội vã ở đó. Tôi đã mở rộng lời giải thích một chút - hy vọng nó có ý nghĩa hơn bây giờ. – Stuart

4

Một giải pháp khả thi là:

if objectWithBool?.bool ?? false { 
    println("objectWithBool != nil && objectWithBool.bool == true") 
} else { 
    println("objectWithBool == nil || objectWithBool.bool == false") 
} 

Các "nil coalescing operator"a ?? b là viết tắt của

a != nil ? a! : b 
+0

Cảm ơn @MartinR. Tôi thích các nhà điều hành không hợp tác nil, nó có thể sản xuất một số mã thực sự gọn gàng. Tôi cho rằng ở đây hơi rõ ràng hơn việc kiểm tra sự bình đẳng với 'true', vì trong nháy mắt, sự hiện diện của' false' có thể giống như logic là một cách khác. Ý tưởng tốt mặc dù! – Stuart

+0

@Stuart: Điều đó phụ thuộc vào cách bạn nhìn vào nó. Đến từ (plain) C, tôi thích 'nếu boolVar {}' thành 'nếu boolVar == true {}' và sau đó '?? false' hoạt động như một giá trị mặc định. Và nó hoạt động tương tự cho các loại khác, ví dụ 'if (myArray? .count ?? 0)> 0'. - Vì vậy, nó chỉ là vấn đề sở thích cá nhân :) –

+0

Bạn nói đúng, và tôi cũng thích 'if boolVar {}' nếu có thể. Tôi cho rằng tôi có nghĩa là nó có thể gây nhầm lẫn trong ý thức ngây thơ rằng trong nháy mắt người ta có thể nhầm lẫn nghĩ rằng biểu thức đang kiểm tra _equality_ với 'false'. Có lẽ tôi sẽ thay đổi suy nghĩ của mình khi tôi quen với việc đọc toán tử '??' :) – Stuart

0

Bạn cũng có thể làm:

if let obj = objectWithBool where obj { 
    // objectWithBool != nil && obj == true 
} else { 
    // objectWithBool == nil || obj == false 
} 
+0

Điều này rất hữu ích nếu bạn cần sử dụng 'Bool' chưa được bỏ trong khối' if', nếu không bạn nên loại bỏ biến đó 'if let _ = objectWithBool ...' hoặc sử dụng một trong các câu trả lời khác. Ngoài ra, lưu ý rằng trong Swift 3 cú pháp đã thay đổi thành 'if let obj = objectWithBool, obj {...} else {...}' – Stuart

Các vấn đề liên quan