2016-10-23 19 views
5

W Swift2, można mieć coś podobnego do następującego kodu:Swift 3, switch, sprawa hasPrefix

switch productIdentifier { 
    case hasSuffix("q"): 
     return "Quarterly".localized 
    case hasSuffix("m"): 
     return "Monthly".localized 
    default: 
     return "Yearly".localized 
    } 

i będzie działać. W Swift 3, tylko w ten sposób mogę dokonać powyższych prac jest:

switch productIdentifier { 
    case let x where x.hasSuffix("q"): 
     return "Quarterly".localized 
    case let x where x.hasSuffix("m"): 
     return "Monthly".localized 
    default: 
     return "Yearly".localized 
    } 

która zdaje się tracić wyrazistość wersji Swift2 - i to sprawia mi myśleć, że jestem brakuje czegoś. Powyższe jest prostą wersją oczywiście. Jestem ciekawy, czy ktoś ma lepszy sposób na to?

+1

nie mogę spraw, aby twój kod Swift 2 działał na Swift 2.2.1/Xcode 7.3.1. Czy mógłbyś pokazać nam działający kod? – OOPer

+0

To był działający kod - wziąłem prosto z mojej bazy kodów. Jednak niektóre rzeczy, takie jak rozszerzenie na Strings dla zlokalizowanych, nie będą działać dla ciebie, ponieważ nie masz tego rozszerzenia. – AlexK

+0

Byłoby lepiej, gdybyś mógł pokazać takie brakujące części. Miałeś szczęście, że w krótkim czasie mogłeś uzyskać poprawną odpowiedź, taki brak informacji doprowadziłby do zalania niskiej jakości odpowiedzi. – OOPer

Odpowiedz

5

nie wiem, czy to jest lepiej niż za pomocą wiązania jak w przykładzie wartość, ale można po prostu użyć podkreślenia zamiast

switch productIdentifier { 
case _ where productIdentifier.hasSuffix("q"): 
    return "Quarterly".localized 
case _ where productIdentifier.hasSuffix("m"): 
    return "Monthly".localized 
default: 
    return "Yearly".localized 
+0

Doceniam to. Po prostu źle się czuję powtarzając nazwę zmiennej w każdym przypadku. – AlexK

3

Wygląda na to, że sprawdzasz tylko ostatni znak identyfikatora produktu. Można zrobić to w ten sposób:

switch productIdentifier.characters.last { 
case "q"?: 
    return "Quarterly".localized 
case "m"?: 
    return "Monthly".localized 
default: 
    return "Yearly".localized 
} 
+1

To jest lepsze rozwiązanie tego konkretnego problemu, +1 – Alexander

+3

Jednak nie tak powszechne. – Alexander

+0

@AlexanderMomchliov, zgodził się. Osobiście nie uważam, że składnia Swift 3 jest niejasna, ale użyłbym tego rozwiązania, gdybym sprawdzał tylko ostatnią postać. – vacawama