出现错误:将空字符串返回到 bool [重复]

Posted

技术标签:

【中文标题】出现错误:将空字符串返回到 bool [重复]【英文标题】:Got error : return an empty string to bool [duplicate] 【发布时间】: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 转换为字符,所以它可能会在那里抛出异常)。 【参考方案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 次是非常低效的。

以上是关于出现错误:将空字符串返回到 bool [重复]的主要内容,如果未能解决你的问题,请参考以下文章

StreamReader.ReadToEnd() 返回空字符串 [重复]

geoip_country_by_name 返回空字符串,没有错误

Elasticsearch多重匹配在提供空字符串时不返回所有结果

Codeigniter 3.0 会话表名称为空字符串,因此出现错误

file_get_contents 返回空字符串

如何从 RPC 调用返回空字符串?