2015-12-18 25 views
6

Bir struct seçeneğim var OptionSetType. Daha sonra kodda, Kişinin örneğinin birden fazla değerin olup olmadığını kontrol etmek için bir anahtar deyimini nasıl kullanabilirim? Birden çok olayı eşleşecek şekilde değiştirin. OptionSetType

Eğer

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? 

} 

Nasıl onun için bir test olacağını ederiz == genç ve güçlü?
Genç ve oğlan çocuğu nasıl test edilir?

cevap

5

OptionSetType, SetAlgebraType'un bir alt türüdür, bu nedenle, seçeneklerin bir kombinasyonunu diğerine karşı test etmek için set cebiri yöntemlerini kullanabilirsiniz. Tam olarak ne sormak istediğinize (ve söz konusu kümelerin ne olduğuna) bağlı olarak, bunu yapmanın birden çok yolu olabilir.

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

: iyi çalışıyor testin türlerinden biri için bu kullanmak, Şimdi

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

:

Birincisi, yerel bir sabiti için sorgulama ediyorum özelliklerini koyacağım Tabii ki, bu özellikle soruyor himyoungBoy listelenen tüm seçenekleri içerir. Tek düşündüğün bu olabilir, bu yüzden bu iyi. Ayrıca daha sonra başka seçeneklere sahip olmak için Person'u uzatırsanız da güvenlidir.

Ama Person diğer olası seçenekleri vardı ve himtamyoungBoy sıralanan seçenekler ve hiçbir başkalarını içerdiğini iddia istediğini olur? SetAlgebraTypeEquatable uzanır, bu yüzden sadece == ile test edebilirsiniz: Bu arada

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

, bunun için bir switch deyimini kullanmak istemiyoruz. Anahtar, olası birkaç durumdan birini seçmek içindir (A veya B mi?), Bu yüzden birleştirici test etmek için kullanmak (A, B, A ve B mi yoksa ikisi de değil mi?) Kodunuzu kullanamaz hale getirir.

+0

çizgi "onu == youngBoy eğer" Çözülmemiş Tanıtıcı "youngBoy" hata Kullanımı verir, ben sorumu güncellenen fazla seçenek içerecek şekilde. Mükemmel açıklama için teşekkürler :) –

+1

'youngBoy' yazımın ilk kod snippet'inde bildirildi. – rickster

0

Sadece basit vaka:

switch him { 
case [.boy, .young]: 
    // code 
default: 
    break 
} 
İlgili konular