有一个任务:创建一个函数,该函数接受一个单词并确定它是否是复数。复数词是以"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
。
对于数组,没有这种歧义,所以Int
是Array.Index
的类型别名,这就是为什么您可以使用Int
来索引Array
编辑 1:
我添加了一个 guard 语句来防止在空字符串的情况下崩溃。显然有更简洁的方法可以解决这个问题,但我认为上面的代码可以更好地澄清提问者对字符串索引的混淆