【问题标题】:Cannot convert value of type 'String' to expected argument type 'Bool'无法将“字符串”类型的值转换为预期的参数类型“布尔”
【发布时间】:2017-10-15 18:34:29
【问题描述】:

我正在尝试编写一个函数,如果字符串 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")

然后我收到错误“无法将类型“字符串”的值转换为预期的参数类型“布尔””

我一直在摆弄代码,但到目前为止没有运气,任何帮助将不胜感激。谢谢你。

【问题讨论】:

标签: swift boolean-expression


【解决方案1】:

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])){

【讨论】:

    【解决方案2】:

    你应该这样写:

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

    您收到错误,因为编译器尝试将“e”和“i”都转换为 Bool 类型。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          它也考虑空字符串的情况。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-30
            • 1970-01-01
            • 2017-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多