6

我决定学习 Swift,并决定立即开始使用 Swift 2。

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

let greeting = "Guten Tag"

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

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

无法使用“(字符串)”类型的参数列表调用“索引”

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

现在,我的问题是:这是

  1. Xcode 7 中的一个错误,它毕竟还是一个 beta 版本,或者
  2. Swift 2 不再适用并且电子书还没有完全更新的东西?

另外:如果答案是“2”,您将如何indices(String)在 Swift 2 中替换?

4

3 回答 3

10

在 Playground 中,如果您转到菜单 View > Debug Area > Show debug area,您可以在控制台中看到完整的错误:

/var/folders/2q/1tmskxd92m94__097w5kgxbr0000gn/T/./lldb/94138/playground29.swift:5:14:错误:'indices'不可用:访问索引集合中的'indices'属性(问候)

此外,Strings 不再符合SequenceTypes,但您可以通过调用来访问它们的元素characters

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

let greeting = "Guten Tag"

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

结果:



_
_
_

标记
_
_

当然,我假设您的示例只是为了 test indices,否则您可以这样做:

for letter in greeting.characters {
    print(letter)
}
于 2015-06-11T10:35:26.723 回答
1

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

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

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"
于 2015-09-24T07:39:50.540 回答
-1

这是您正在查看的代码:

var middleName :String? = "some thing"
for index in (middleName?.characters.indices)! {
// do some thing with index
}
于 2015-09-24T10:44:41.427 回答