2015-12-18 15 views
6

Tôi có một cấu trúc Người mở rộng OptionSetType. Sau đó trong mã, Làm thế nào tôi có thể sử dụng một tuyên bố chuyển đổi để kiểm tra xem một thể hiện của người có nhiều hơn một giá trị?Chuyển đổi để khớp nhiều trường hợp từ OptionSetType

Cảm ơn bạn

struct Person: OptionSetType { 
let rawValue: Int 
init(rawValue: Int){ 
    self.rawValue = rawValue 
} 

    static let boy   = Person(rawValue: 1 << 0) 
    static let young  = Person(rawValue: 1 << 1) 
    static let smart  = Person(rawValue: 1 << 2) 
    static let strong  = Person(rawValue: 1 << 3) 
} 

//later declared 
var him: Person! 

//later initialised 
him = [.boy, .young] 

//now test using a switch block 
Switch (him) { 
    case .boy & .young // <----- How do you get this to work? 

} 

Làm thế nào sẽ thử nghiệm cho anh ta == trẻ trung và mạnh mẽ?
Làm thế nào để kiểm tra anh ta có chứa trẻ và cậu bé?

Trả lời

5

OptionSetType là loại phụ của SetAlgebraType, vì vậy bạn có thể sử dụng các phương pháp đại số được đặt để thử nghiệm một kết hợp các tùy chọn với một tùy chọn khác. Tùy thuộc vào chính xác những gì bạn muốn hỏi (và những gì các bộ trong câu hỏi được), có thể có nhiều cách để làm điều đó.

Trước tiên, tôi sẽ đặt các thuộc tính tôi truy vấn tại một hằng địa phương:

let youngBoy: Person = [.Young, .Boy] 

Bây giờ, để sử dụng cho một loại bài kiểm tra đó hoạt động tốt:

if him.isSupersetOf(youngBoy) { 
    // go to Toshi station, pick up power converters 
} 

Tất nhiên, điều này đặc biệt yêu cầu là liệu him có chứa tất cả các tùy chọn được liệt kê trong youngBoy hay không. Đó có thể là tất cả các bạn quan tâm, vì vậy đó là tốt. Và nó cũng an toàn nếu sau này bạn mở rộng Person để có các tùy chọn khác.

Nhưng nếu Person có tùy chọn có thể khác, và bạn muốn khẳng định rằng him chứa chính xác các tùy chọn được liệt kê trong youngBoy, và không có những người khác? SetAlgebraType kéo dài Equatable, vì vậy bạn chỉ có thể kiểm tra với ==:

if him == youngBoy { 
    // he'd better have those units on the south ridge repaired by midday 
} 

Bằng cách này, bạn không muốn sử dụng một tuyên bố switch cho việc này. Switch là để chọn một trong số các trường hợp có thể (có phải là A hoặc B?), Vì vậy sử dụng nó để kiểm tra tổ hợp (có phải là A, B, A và B hay không?) Làm cho mã của bạn khó sử dụng.

+0

Dòng "nếu anh ấy == youngBoy" cho Sử dụng lỗi của Unresolved Identifier "youngBoy", tôi cập nhật câu hỏi của tôi để bao gồm thêm nhiều lựa chọn. Cảm ơn lời giải thích tuyệt vời :) –

+1

'youngBoy' được khai báo trong đoạn mã đầu tiên của bài đăng của tôi. – rickster

0

trường hợp Chỉ cần đơn giản:

switch him { 
case [.boy, .young]: 
    // code 
default: 
    break 
} 
Các vấn đề liên quan