Swift end.index不会对字符串中的字母进行索引

Swift end.index不会对字符串中的字母进行索引,swift,Swift,有一个任务: 创建一个函数,该函数接受一个单词并确定它是否为复数。复数词是以“s”结尾的词 这是我的解决方案: func isPlural(_ word: String) -> Bool { return word[word.endIndex - 1] == "s" } 现在它有一个错误 二进制运算符“-”不能应用于“String.Index”(又名“String.CharacterView.Index”)和“Int”类型的操作数 返回单词[word.endI

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

这是我的解决方案:

func isPlural(_ word: String) -> Bool {
    return word[word.endIndex - 1] == "s"
}
现在它有一个错误

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

否则,在使用如下数组的情况下:

设x=数组(字.字符)

任务解决了


为什么索引不能与字符串一起使用?

解决方法是:

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,因此出现了错误

进一步细化(如果需要):

func isPlural(_ word: String) -> Bool {
    return word[word.endIndex - 1] == "s"
}
无法使用
Int
在Swift中为字符串编制索引的原因与它们在内部的表示方式有关。字符串只不过是隐藏在引擎盖下的一个Unicode序列。因此,一个Unicode可以表示一个
字符
,或者三个Unicode可以表示完全相同的
字符
。使用
Int
索引可能会在索引方面造成一些歧义。要解决此问题,请使用
String.Index

对于数组,没有这种歧义,因此
Int
Array.Index
的类型别名,这就是为什么可以使用
Int
数组编制索引的原因

编辑1:

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

我添加了一个guard语句,以防止出现空字符串时崩溃。显然有更简洁的方法来解决这个问题,但我认为上面的代码更好地澄清了提问者对字符串索引的困惑。索引不是其他答案中详述的
Int

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

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

为什么不直接返回word.last==“s”
?如果您想同时检测大写字母
word.last?.lowercased()==“s”
Btw,这将导致空字符崩溃string@LeoDabus我认为人们仍然可以从剩下的答案中学到一些东西。如果需要,请随意编辑。我同意答案确实解释了问题,但即使是现在,它也不是正确的解决方案。有许多替代方案不会因空字符串而崩溃。如果你仍然想用这个答案,你应该在答案中加入这个可能性,并使用一个警卫来避免撞车。来自docs参数-集合的有效索引。我必须比startIndex更强大。