2017-10-15 3 views
0

Ich versuche eine Funktion zu schreiben, die true zurückgibt, wenn die Zeichenfolge str mit einem Vokal beginnt. der folgende Code kompiliert feineWert des Typs 'String' kann nicht in den erwarteten Argumenttyp 'Bool' konvertiert werden

func beginsWithVowel(str: String) -> Bool { 
    if(str.characters.count == 0){ 
     return false 
    } else if(str.characters[str.startIndex] == "a"){ 
     return true 
    } 
    return false 
} 
beginsWithVowel(str: "apple") 

das Problem ist, wenn ich das erste Zeichen mehr als ein Zeichen, zum Beispiel vergleichen

else if(str.characters[str.startIndex] == "a" || "e" || "i") 

dann bekomme ich die Fehlermeldung ‚umwandeln kann nicht den Wert des Typs‘ String 'zum erwarteten Argumenttyp' Bool ''

Ich habe mit dem Code herumgespielt, aber bisher kein Glück, jede Hilfe wäre willkommen. Vielen Dank.

+0

Oder 'wenn [" a "," e "," i "]. Enthält (string [string.startIndex]) {...}' – Rob

+0

Siehe https://stackoverflow.com/questions/32750139/how -ein-Wert-gegen-mehrere-Werte-swift zu vergleichen. –

Antwort

3

Swift kann nicht auf die Logik schließen, die Sie versuchen zu machen. Die Logik zu Swift wird dies so etwas wie:

if(str.characters[str.startIndex] == "a" || "e" || "i")

zu if(<Boolean expression> || "e" || "i") entspricht

äquivalent zu if(<Boolean expression> || <String expression> || String expression)

Eine alternative Lösung sein kann:

if(["a", "b", "c"].contains(str.characters[str.startIndex])){

1

Sie sollten es so schreiben:

else if(str.characters[str.startIndex] == "a" || str.characters[str.startIndex] == "e" || str.characters[str.startIndex] == "i") 

Sie den Fehler, da der Compiler beide „e“ zu konvertieren versucht und „i“ Bool eingeben.

0

Statt zu verwenden, wenn sonst Schalter wird mehr sein effiziente E:

func beginsWithVowel(str: String) -> Bool { 

    guard str.characters.count > 0 else { 
     return false 
    } 

    switch str.characters[str.startIndex]{ 
    case "a","e","i","o","u": return true 
    default: return false 
    } 
} 
0

Wenn Sie "a" || "e" || "i" führen Sie zwischen dem strings vergleichen. Verwenden Sie diesen Code:

if(str.characters[str.startIndex] == "a" 
    || str.characters[str.startIndex] == "e" 
    || str.characters[str.startIndex] == "i") { 

    // Your Code... 

} 
0

Die Boolesche OR-Operator || Booleschen Ausdrücken erwartet.

So müssten Sie EXPR == "a" || EXPR == "e" || EXPR == "i" schreiben, wobei EXPR der Ausdruck ist, um das erste Zeichen zu erhalten.

Allerdings gibt es eine einfachere Lösung (Code ist Swift 4)

func beginsWithVowel(str: String) -> Bool { 
    return "aeiou".contains(String(str.prefix(1))) 
} 

Es hält auch die leere Zeichenkette Fall.

Verwandte Themen