【问题标题】:Got error : return an empty string to bool [duplicate]出现错误:将空字符串返回到 bool [重复]
【发布时间】:2017-06-01 19:56:20
【问题描述】:

我想测试输入字符串是否为“”。如果输入字符串是“”,则返回false。

 var x = ""
 func beginsWithVowel(x: String) -> Bool {
    if x.characters[x.startIndex] == "a" || x.characters[x.startIndex] == "A"{
        return true
    }else if x.characters[x.startIndex] == "e" || x.characters[x.startIndex] == "E"{
        return true
    }else if x.characters[x.startIndex] == "i" || x.characters[x.startIndex] == "I"{
        return true
    }else if x.characters[x.startIndex] == "o" || x.characters[x.startIndex] == "O"{
        return true
    }else if x.characters[x.startIndex] == "u" || x.characters[x.startIndex] == "U"{
        return true
    }else {
    return false
    }
}

beginsWithVowel(x: x)

但我收到一个错误:致命错误:无法从空字符串中形成字符。 我该如何解决?谢谢你。 附言不能使用可选字符串,问题不是如何检查空字符串,而是为什么它不能在函数中返回布尔值。

【问题讨论】:

  • 我会先检查 x 是否为空(在检查它是否为 A、E 等之前),因此不会对空字符串应用任何方法('.characters' 似乎将 x 转换为字符,所以它可能会在那里抛出异常)。

标签: swift


【解决方案1】:

你可以使用guard来确保你的字符串有第一个字符,你可以使用一个带有元音的数组来检查它是否包含第一个字符。

func beginsWithVowel(x: String) -> Bool {
    guard let first = x.characters.first else { return false }
    return ["a","e","i","o","u","A","E","I","O","U"].contains(first)
}

【讨论】:

  • 您可以将其简化为 .contains(first),因为 Swift 会推断字面量数组为 [Character]
【解决方案2】:

先做空检查

func beginsWithVowel(x: String) -> Bool {
    if x.isEmpty { return false }
    if x.characters[x.startIndex] == "a" { ...

使用正则表达式的方法略有不同,它包括空检查:

func beginsWithVowel(x: String) -> Bool {
    let regex = try! NSRegularExpression(pattern: "^[aeiou]", options: .caseInsensitive)
    return regex.firstMatch(in: x, range: NSMakeRange(0, x.utf16.count)) != nil
}

【讨论】:

  • 为什么先做空支票可以修呢?有什么原则吗?
  • 因为如果它通过了测试,就可以保证字符串中至少有一个字符。如果startIndex 处没有字符,则会发生错误。顺便说一句:用这种语法检索第一个字符 10 次是非常低效的。
猜你喜欢
  • 2019-10-29
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2015-05-18
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多