2014-11-25 5 views
7

Mam typ enum, który rozszerza String w Swift.Przełącznik Swift - Etykieta Case w przełączniku powinna mieć co najmniej jedną wykonywalny komunikat.

Kiedy próbuję użyć switch mam błąd:

Case label in a switch should have at least one executable statement

Oto mój kod:

enum UserInfosKey:String { 
    case CameraMyPhotoStream = "CMPS" 
    case CameraICloudActivated = "CICA" 
    case CameraICloudShare = "CICS" 
    case ProjectTodayExtension = "PTE" 
    case ProjectShareExtension = "PSE" 
    case NetworkConnection = "NC" 
    case PhoneLanguage = "PL" 
    case CameraPhotosCount = "CPC" 
    case UserIdentifier = "UI" 
    case VersionHistory = "VH" 
    case Path = "Path" 

} 

class UserInfosController: NSObject { 
    func update(key:UserInfosKey, value:String, context:UserDefaultsMainKeys) -> String { 
     switch key { 
     case .CameraICloudActivated: 
     case .CameraICloudShare: 
     case .CameraMyPhotoStream: 
     case .CameraPhotosCount: 
     case .NetworkConnection: 
     case .PhoneLanguage: 
     case .UserIdentifier: 
      return value 

     default: 
      return "" 
     } 
    } 
} 

enter image description here

Jestem całkiem pewien, że to prosty błąd, ktoś to widzi?

Odpowiedz

12

Nie ma niejawny fallthrough w szybkim switch oświadczeniu, więc trzeba jawnie ustawione, że:

case .CameraICloudActivated: fallthrough 
    case .CameraICloudShare: fallthrough 
    case .CameraMyPhotoStream: fallthrough 
    case .CameraPhotosCount: fallthrough 
    case .NetworkConnection: fallthrough 
    case .PhoneLanguage: fallthrough 
    case .UserIdentifier: 
     return value 

Bez tego każdy przypadek ma niejawny przerwę.

Zauważ, że Swift wymaga, aby każdy przypadek przełącznik zawiera co najmniej jedno stwierdzenie - w przypadku braku rachunku, wyraźne break należy stosować (co w tym przypadku oznacza „nic nie robić”)

+0

Ok ty, i stwierdziłem, że można go przeciąć przecinkiem. 'case .value1, .value2:'. Zapomniałem, ale to było w pierwszych rozdziałach ebook. (Zaakceptuję tę odpowiedź jak najszybciej) – Francescu

+0

Tak, to inny sposób, ale na długą listę wolę wyraźną listę "jeden po drugim", chociaż kosztem więcej kodu - to jest bardziej czytelne w moich oczach, ale to po prostu kwestia preferencji. Miło mieć więcej niż jeden sposób, aby zrobić to samo. – Antonio

5

Można mieć wiele wartości w przypadku, wystarczy, że oddzielisz je przecinkiem.

Chciałbym również polecić zwracanie wartości zerowej niż pusty ciąg znaków i sprawić, aby funkcja zwracała wartość String ?, ale to zależy od tego, w jaki sposób funkcja będzie używana.

func update(key:UserInfosKey, value:String, context:UserDefaultsMainKeys) -> String? { 
    switch key { 
    case .CameraICloudActivated, 
     .CameraICloudShare, 
     .CameraMyPhotoStream, 
     .CameraPhotosCount, 
     .NetworkConnection, 
     .PhoneLanguage, 
     .UserIdentifier: 
     return value 
    default: 
     return nil 
    } 
}