无法转换类型' String'的值预期的论证类型' Bool'

时间:2017-10-15 18:34:30

标签: ios swift xcode

我正在尝试编写一个函数,如果String str以元音开头,它将返回true。以下代码将编译正确

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")

问题是当我将第一个字符与多个字符进行比较时,例如

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

然后我收到错误'无法转换类型' String'的值预期参数类型' Bool'

我一直在摆弄代码,但到目前为止没有运气,任何帮助都会受到赞赏。谢谢。

5 个答案:

答案 0 :(得分:3)

Swift无法推断出你想要的逻辑。 Swift的逻辑变成了这样的东西:

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

相当于if(<Boolean expression> || "e" || "i")

相当于if(<Boolean expression> || <String expression> || String expression)

另一种解决方案可以是:

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

答案 1 :(得分:2)

你应该这样写:

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

您收到错误,因为编译器尝试转换&#34; e&#34;和&#34;我&#34;输入Bool。

答案 2 :(得分:2)

而不是使用if else开关将更有效:

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
    }
}

答案 3 :(得分:1)

当您执行"a" || "e" || "i"时,您正在strings进行比较。使用此代码:

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

    // Your Code...

}

答案 4 :(得分:1)

布尔OR运算符||需要布尔表达式。

所以你必须写EXPR == "a" || EXPR == "e" || EXPR == "i",其中EXPR是获取第一个字符的表达式。

然而,有一个更简单的解决方案(代码是Swift 4)

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

它也考虑空字符串。