Swift 2中的字符串索引

时间:2015-06-11 10:32:05

标签: xcode swift swift-playground swift2

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

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

let greeting = "Guten Tag"

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

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

  

无法使用类型为'(String)'

的参数列表调用'indices'

我也尝试过与Xcode 6(Swift 1.2 AFAIK)相同的东西,它按预期工作。

现在,我的问题是:

  1. Xcode 7中的错误,毕竟它仍然是测试版,或者?
  2. 使用Swift 2不再起作用的东西,电子书还没有完全更新?
  3. 另外:如果答案是“2”,你将如何替换Swift 2中的indices(String)

3 个答案:

答案 0 :(得分:8)

在游乐场,如果你进入菜单View>调试区域>显示调试区域,您可以在控制台中看到完整错误:

  

/ var / folders / 2q / 1tmskxd92m94__097w5kgxbr0000gn / T /./ lldb / 94138 / playground29.swift:5:14:错误:'指数'不可用:访问'指数'集合上的财产   索引中的索引(问候语)

此外,String不再符合SequenceType s,但您可以通过调用characters来访问其元素。

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

let greeting = "Guten Tag"

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

结果:

     ü
  Ť
  Ë
  n

     

Ť
  一个
  g

当然,我认为您的示例只是为了测试indices,否则您可以这样做:

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

答案 1 :(得分:1)

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

在项目中包含此String扩展名:

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"

答案 2 :(得分:-1)

以下是您要查找的代码:

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