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)尝试了同样的事情,它按预期工作。
现在,我的问题是:这是
- Xcode7的一个错误,毕竟还是测试版,或者
- 有些东西不再适用于 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)
此外,String
s 不再符合 SequenceType
s,但您可以通过调用 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
}
我决定学习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)尝试了同样的事情,它按预期工作。
现在,我的问题是:这是
- Xcode7的一个错误,毕竟还是测试版,或者
- 有些东西不再适用于 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)
此外,String
s 不再符合 SequenceType
s,但您可以通过调用 characters
.
所以 Swift 2 的解决方案是这样的:
let greeting = "Guten Tag"
for index in greeting.characters.indices {
print(greeting[index])
}
结果:
G
u
t
e
nT
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
}