2015-10-01 51 views
6

Vì vậy, trong Objective-C khi sử dụng Booleans nó có thể, và khuyến khích, để viết mã sử dụng khác không giá trị của một biến vì nó là giá trị boolean, có nghĩa là bạn có thể viết mã như thế này:Swift Boolean kiểm tra

if (someBool) { 
    // Stuff 
} 

Ngoài ra, có những lý do tại sao mã như sau không được khuyến khích:

if (someBool == YES) { 
    // Might run into problems here 
} 

những lý do tại sao việc kiểm tra một boolean chống boolean khác là tốt hơn giải thích here, nhưng ngắn gọn vấn đề chỉ là khi bạn đang so sánh bình đẳng để YES hoặc NO trực tiếp, bạn thực sự so sánh tương ứng với 10. Vì Objective-C cho phép sử dụng các giá trị khác 0 như là một giá trị chân lý, bạn có thể kết thúc so sánh một cái gì đó cần được xem là true đối với YES và có biểu thức giải quyết thành NO, ví dụ:

int trueNumber = 2; 
if (trueNumber == YES) { 
    // Doesn't run because trueNumber != 1 
} 

Đây có phải là sự cố trong Swift không? Các vấn đề về kiểu mã sang một bên, nếu tôi thấy một cái gì đó như sau

var someBool = true 
if someBool == true { 
    // stuff 
} 

đó sẽ là một vấn đề hay nó không thực sự quan trọng? Những so sánh kiểu C này vẫn đang diễn ra dưới sự che chở hay liệu có cái gì đó được tích hợp vào Swift BooleanType để ngăn chặn những vấn đề này?

Trả lời

2

các if <something> {} cấu trúc trong Swift đòi hỏi sự <something> để phù hợp với các giao thức BooleanType đó là được định nghĩa như sau:

public protocol BooleanType { 
    /// The value of `self`, expressed as a `Bool`. 
    public var boolValue: Bool { get } 
} 

Nếu loại không tuân theo giao thức này, lỗi biên dịch sẽ bị ném n. Nếu bạn tìm kiếm giao thức này trong thư viện chuẩn, bạn thấy rằng loại duy nhất phù hợp với giao thức này là Bool. Bool là một loại có thể là true hoặc false. Đừng nghĩ nó là số 1 hoặc 0, mà đúng hơn là Bật/Tắt Đúng/Sai.

Bây giờ giao thức này có thể được phù hợp với bất kỳ loại danh nghĩa mà bạn muốn, ví dụ:

extension Int : BooleanType { 
    public var boolValue : Bool { 
     return self > 0 
    } 
} 

Bây giờ nếu bạn làm điều này (bạn không nên thành thật), bạn đang xác định nó bằng cách tự hỏi "True "và" False "có nghĩa là. Bây giờ bạn có thể sử dụng nó như thế này (một lần nữa, đừng làm điều này):

if 0 { 
    ... 
} 
+0

Được rồi, vậy lý do tại sao mã đó là một vấn đề trong Objective-C không phải là một vấn đề đơn giản chỉ vì kiểm tra kiểu nghiêm ngặt trong Swift? Nó có vẻ giống như để được sử dụng trong kiểm tra boolean trong Swift, một kiểu cơ bản phải trả về một 'Bool' đúng kiểu (như bạn đã thấy ở trên), để tránh vấn đề mà C và Objective-C có với' typedef đã ký char'. Nó đơn giản như thế sao? – Ziewvater

+0

@Ziewvater Yup, đúng – Kametrixom

2

Swift có loại Bool. Điều này khác với BOOL của khách quan-c không phải là loại thực tế. Nó thực sự là typedef unsigned char. Khi nhanh chóng mong đợi Bool bạn phải cung cấp cho nó Bool nếu không nó là biên dịch lỗi. Các mã sau đây sẽ không biên dịch vì kiểm tra không bool

let check = 2 
if check { 
} 

Nhưng điều này sẽ làm việc vì == trả về Bool

let check = 2 
if check == 2 { 
} 
+0

Trên thực tế 'Bool' là kiểu riêng của mình trong Swift và * không * một loại bí danh để " unsigned char "(sẽ là' CUnsignedChar' trong Swift). –

+0

Xin lỗi tôi có nghĩa là Objective-C không nhanh chóng – mustafa

+0

Vâng, nó phức tạp hơn trong Objective-C, so sánh http://stackoverflow.com/questions/31267325/bool-with-64-bit-on-ios. –

0

Để hiểu phong cách ObjC, bạn cần quay lại C.Trong C, tuyên bố này:

if (something) { 
    // Do something 
} 

sẽ đánh giá để false nếu something là null hoặc 0. Mọi thứ khác đánh giá để true. Vấn đề là C không có kiểu boolean. Objective-C thêm YESNO mà về cơ bản là 1 và 0. Vì vậy:

if (aBoolValue == YES) { } // Work as expected 
if (anIntValue == YES) { } // False unless anIntValue == 1 

Các "nản" khuyến cáo là để phù hợp với các hành vi trong C. Swift không có yêu cầu tương thích ngược như vậy. Bạn không thể viết này:

Thay vào đó, khái niệm phải đánh giá một giá trị boolean:

if anIntValue != 0 { } // Ok 
if anObject != nil { } // Ok 
Các vấn đề liên quan