Swift 2 中的字符串索引

String indices in Swift 2

我决定学习Swift,我决定马上开始学习Swift2。

所以这是一个非常基本的示例,类似于 Apple 自己的电子书中关于 Swift

的示例之一
let greeting = "Guten Tag"

for index in indices(greeting) {
    print(greeting[index])
}

我在 Xcode 7 的操场上试过这个,我收到以下错误

Cannot invoke 'indices' with an argument list of type '(String)'

我也用 Xcode 6(即 Swift 1.2 AFAIK)尝试了同样的事情,它按预期工作。

现在,我的问题是:这是

  1. Xcode7的一个错误,毕竟还是测试版,或者
  2. 有些东西不再适用于 Swift 2 并且电子书还没有完全更新?

另外:如果答案是“2”,你会如何替换 Swift 中的 indices(String) 2?

在 Playground 中,如果您转到菜单视图 > 调试区域 > 显示调试区域,您可以在控制台中看到完整的错误:

/var/folders/2q/1tmskxd92m94__097w5kgxbr0000gn/T/./lldb/94138/playground29.swift:5:14: error: 'indices' is unavailable: access the 'indices' property on the collection for index in indices(greeting)

此外,Strings 不再符合 SequenceTypes,但您可以通过调用 characters.

访问它们的元素

所以 Swift 2 的解决方案是这样的:

let greeting = "Guten Tag"

for index in greeting.characters.indices {
    print(greeting[index])
}

结果:

G
u
t
e
n

T
a
g

当然,我假设你的例子只是为了测试 indices,否则你可以这样做:

for letter in greeting.characters {
    print(letter)
}

为了完成,我找到了一种非常简单的方法来从字符串中获取字符和子字符串(这不是我的代码,但我不记得从哪里得到的):

在您的项目中包含此字符串扩展:

extension String {

    subscript (i: Int) -> Character {
        return self[self.startIndex.advancedBy(i)]
    }

    subscript (i: Int) -> String {
        return String(self[i] as Character)
    }

    subscript (r: Range<Int>) -> String {
        return substringWithRange(Range(start: startIndex.advancedBy(r.startIndex), end: startIndex.advancedBy(r.endIndex)))
    }
}

这将使您能够:

print("myTest"[3]) //the result is "e"
print("myTest"[1...3]) //the result is "yTe"

这是您要查找的代码:

var middleName :String? = "some thing"
for index in (middleName?.characters.indices)! {
// do some thing with index
}