2017-01-09 3 views
0

Es gibt zwei UIAlertView Variablen, aber nur eine ist optional. Lassen Sie uns sagenWie entfaltet man ein optionales While Pattern Matching in Swift?

lazy var a: UIAlertView = { 

    return UIAlertView() // Which is not important here 
}() 

var b: UIAlertView? 

und die delegierte Methode

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) { 

    switch (alertView, buttonIndex) { 

    case (a, 0): // Do something 
    case (a, 1): // Do something 
    case (b, 1): // <== Want to do something here but, b is optional. 
    default: break 
    } 
} 

Wie b während Mustervergleich auszupacken?

NB: Die Fragen sind über die Swift language nicht über die UIAlertView.

Irgendwelche Hilfe?

+0

Mögliche Duplikat http: // stackoverflow.com/questions/26941529/swift-testing-against-optional-value-in-switch-case. –

+0

@MartinR Nein, meine Frage ist genau das Gegenteil der Frage, die du erwähnt hast. – Goppinath

+0

Ich glaube nicht. Diese * Frage * ist, wie man den nicht-optionalen 'someValue' mit dem optionalen' someOptional' abgleicht und genau das ist es, was Sie fragen. Der erste Vorschlag in der angenommenen Antwort macht es umgekehrt, aber der zweite Vorschlag 'case let val wobei val == someOptional:' würde auch in Ihrem Fall funktionieren (und ist ähnlich dem, was Callam unten vorgeschlagen hat). –

Antwort

1

Sie könnten eine where-Klausel verwenden, um zu überprüfen, ob alertView gleich b ist.

case (_, 1) where alertView == b: 

in nicht nil alertView ungeöffneten Um sicherzustellen, nur den Unterstrich mit .some ersetzen.

Oder in ähnlicher Weise könnten Sie die unverpackte alertView lassen, aber das ist im Wesentlichen das Gleiche wie oben.

case (let .Some(_alertView), 1) where _alertView == b: 
+0

Es funktioniert, aber es ist nicht befriedigend für mich. Lass mich eine Weile warten und eine richtige Antwort geben. Bis dahin eine Abstimmung. Vielen Dank. – Goppinath

+0

@Goppinath danke für den upvote. Was stört dich genau? – Callam

+1

Danke noch einmal! – Goppinath

0

Sie könnten versuchen, diese (mit ? im Fall) Sie werden self.b auf das Tupel hinzufügen müssen, die Sie dem Einschalten:

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) { 
    switch (b, alertView, buttonIndex) { 
    case (_, a, 0), (_,a,1): // Do something 
    case (b?, a, 1): // <== b is not optional here (only matches case .Some = b and binds to local variable `b` 
    default: break 
    } 
} 
+0

Ich habe das auch versucht, aber es hat nicht funktioniert. Kann es sein, dass ich Swift 2.2 noch benutze? – Goppinath

+0

Aktualisiert, lassen Sie mich wissen, wenn das nicht kompiliert –