无法转换类型为';Int';到预期的参数类型';指数';(aka';String.CharacterView.Index';)

无法转换类型为';Int';到预期的参数类型';指数';(aka';String.CharacterView.Index';),string,swift,String,Swift,代码: 这正如预期的那样有效 但如果我取消注释最后4行,则会得到: let x: String = ("abc".substringFromIndex(1)) print(x) //func tail(s: String) -> String { // return s.substringFromIndex(1) //} //print(tail("abcd")) 真奇怪 这是因为字符串中的下标函数不再在int上运行,而是在内部索引类型上运行: Error: cannot conv

代码:

这正如预期的那样有效

但如果我取消注释最后4行,则会得到:

let x: String = ("abc".substringFromIndex(1))
print(x)
//func tail(s: String) -> String {
//    return s.substringFromIndex(1)
//}
//print(tail("abcd"))

真奇怪

这是因为
字符串
中的下标函数不再在int上运行,而是在内部
索引
类型上运行:

Error: cannot convert value of type 'Int' to expected argument type 'Index' (aka 'String.CharacterView.Index')
因此,您需要获取一些
索引
值。您可以通过获取字符串中的第一个索引(也称为第一个字符的索引)来实现这一点,并从中导航:

extension String {
    public typealias Index = String.CharacterView.Index

    //...

    public subscript (i: Index) -> Character { get }
请注意,上面的代码不再在最新的Swift版本中编译,出于历史目的,我将离开这里,并为那些停留在早期Swift中的人

现在我们可以写一些类似于

扩展字符串{
var tail:String{String(self[index(startIndex,offsetBy:1)…])}
//或
var tail:String{String(self[index(after:startIndex)…])}
//甚至这个
var tail:String{String(dropFirst())}
}
在Swift 4中:

func tail(s: String) -> String {
    return s.substringFromIndex(s.startIndex.advancedBy(1))
}

我描述的是一种奇怪的行为,而不仅仅是问如何得到一根绳子的尾巴。这不是复制品。
func tail(s: String) -> String {
    return String(s.suffix(from: s.index(s.startIndex, offsetBy: 1)))
}