【问题标题】:end.index does not indetify letters in a stringend.index 不识别字符串中的字母
【发布时间】:2020-07-04 16:12:11
【问题描述】:

有一个任务: 创建一个接收单词并确定它是否为复数的函数。复数词是以“s”结尾的词

这是我的解决方案:

func isPlural(_ word: String) -> Bool {
    return word[word.endIndex - 1] == "s"
}

现在有错误

二元运算符“-”不能应用于“String.Index”(又名“String.CharacterView.Index”)和“Int”类型的操作数 返回单词[word.endIndex - 1] == "s"

否则,当我们使用这样的数组时:

让 x = Array(word.characters)

任务解决

为什么索引不适用于字符串?

【问题讨论】:

  • 为什么不直接返回word.last == "s"?如果您也想检测大写字母word.last?.lowercased() == "s"

标签: swift


【解决方案1】:

String.Index 不是Int,如其他答案中所述。

有一个更简单的解决方案来确定字符串是否以特定字符结尾

func isPlural(_ word: String) -> Bool {
    return word.hasSuffix("s")
}

【讨论】:

    【解决方案2】:

    解决办法是:

    func isPlural(_ word: String) -> Bool {
        guard !word.isEmpty else { return false }
        
        return word[word.index(before: word.endIndex)] == "s"
    }
    

    您的代码不起作用的原因是因为 Swift 中的字符串是按类型 String.Index 而不是 Int 索引的。您试图通过对其执行“-1”来将其视为 Int,因此出现错误。

    详细说明(如果需要):

    字符串不能在 Swift 中使用Int 索引的原因与它们在内部的表示方式有关。字符串只不过是引擎盖下的 Unicode 序列。因此,一个 Unicode 可以代表一个 Character,或者三个 Unicode 代表完全相同的 Character。使用Int 索引可能会在索引方面造成一些歧义。为了解决这个问题,使用了String.Index

    对于数组,没有这样的歧义,所以IntArray.Index 的类型别名,这就是为什么您可以使用Int 来索引Array

    编辑 1:

    我添加了一个保护语句以防止在出现空字符串时崩溃。显然有更简洁的方法可以解决这个问题,但我认为上面的代码更好地澄清了提问者对字符串索引的困惑

    【讨论】:

    • 顺便说一句,这会因空字符串而崩溃
    • @LeoDabus 我认为人们仍然可以从其他答案中学到一些东西。如果需要,请随意编辑
    • 我同意答案确实解释了问题,但即使现在它也不是正确的解决方案。有许多替代方案不会因空字符串而崩溃。如果您仍然想使用这个,您应该在您的答案中添加这种可能性并使用防护装置来避免崩溃。来自文档 Parameters - 集合的有效索引。 i 必须大于 startIndex。
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多