2016-04-23 37 views
8

Sto cercando di utilizzare un interruttore in un metodo @IBAction, che viene agganciato al più pulsantiAttivazione del titolo UIButton: il modello di espressione di tipo "String" non può corrispondere ai valori di tipo "String ?!"

@IBAction func buttonClick(sender: AnyObject) { 

     switch sender.currentTitle { 
      case "Button1": 
       print("Clicked Button1") 
      case "Button2": 
       print("Clicked Button2") 
      default: 
       break 
     } 

Quando provo quanto sopra, ottengo il seguente errore:

Expression pattern of type 'String' cannot match values of type 'String?!'

+0

Fa 'interruttore (! Mittente come UIButton) .currentTitle {' lavoro? – NobodyNada

+0

@NobodyNada no ... – Andrei

+0

@EdCottrell È possibile confrontare le stringhe direttamente in Swift, poiché test come '==' test per l'uguaglianza, mentre '===' verifica se gli oggetti sono lo stesso oggetto esatto. – NobodyNada

risposta

12

currentTitle è un opzionale, quindi è necessario scartarlo. Inoltre, il tipo di sender deve essere UIButton poiché si accede alla proprietà currentTitle.

@IBAction func buttonClick(sender: UIButton) { 
    if let theTitle = sender.currentTitle { 
     switch theTitle { 
      case "Button1": 
       print("Clicked Button1") 
      case "Button2": 
       print("Clicked Button2") 
      default: 
       break 
     } 
    } 
} 
+0

Grazie per la risposta, tuttavia ora ottengo che 'Il modello di espressione di tipo 'String' non può corrispondere ai valori di tipo 'String?'' – Andrei

+0

non dimenticare di menzionare anche che funziona solo perché hai cambiato il parametro metodo da AnyObject a UIButton –

+0

@Andrei Assicurati di modificare il tipo di mittente su 'UIButton' –

1

Un altro modo di scartare currentTitle e penso che una più elegante è:

switch sender.currentTitle ?? "" { 
    //case statements go here 
}