end.index 不会对字符串中的字母进行独立处理



有一个任务:创建一个函数,该函数接受一个单词并确定它是否是复数。复数词是以"s"结尾的词

这是我的解决方案:

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

现在它有一个错误

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

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

let x = 数组(单词.字符(

任务已解决

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

String.Index

并没有像其他答案中阐述的那样Int

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

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

解决方案是:

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:

我添加了一个 guard 语句来防止在空字符串的情况下崩溃。显然有更简洁的方法可以解决这个问题,但我认为上面的代码可以更好地澄清提问者对字符串索引的混淆

最新更新