Swift 3.0迭代String.Index范围

p0l*_*ris 25 swift swift3

使用Swift 2.2可以实现以下功能:

let m = "alpha"
for i in m.startIndex..<m.endIndex {
    print(m[i])
}
a
l
p
h
a
Run Code Online (Sandbox Code Playgroud)

使用3.0,我们收到以下错误:

类型'范围'(又名'范围')不符合协议'序列'

我试图用swift中的字符串做一个非常简单的操作 - 只是遍历字符串的前半部分(或更普遍的问题:遍历字符串的范围).

我可以做以下事情:

let s = "string"
var midIndex = s.index(s.startIndex, offsetBy: s.characters.count/2)
let r = Range(s.startIndex..<midIndex)
print(s[r])
Run Code Online (Sandbox Code Playgroud)

但在这里,我并没有真正遍历字符串.所以问题是:如何遍历给定字符串的范围.喜欢:

for i in Range(s.startIndex..<s.midIndex) {
    print(s[i])
}
Run Code Online (Sandbox Code Playgroud)

Khu*_*pan 27

您可以使用indices属性属性遍历字符串,characters如下所示:

let letters = "string"
let middle = letters.index(letters.startIndex, offsetBy: letters.characters.count / 2)

for index in letters.characters.indices {

    // to traverse to half the length of string 
    if index == middle { break }  // s, t, r

    print(letters[index])  // s, t, r, i, n, g
}
Run Code Online (Sandbox Code Playgroud)

字符串和字符 - 计数字符部分中的文档:

扩展的字形集群可以由一个或多个Unicode标量组成.这意味着不同的字符和相同字符的不同表示可能需要不同的内存量来存储.因此,Swift中的字符不会在字符串表示中占用相同数量的内存.因此,如果不迭代字符串以确定其扩展的字形集群边界,则无法计算字符串中的字符数.

重点是我自己的.

这不起作用:

let secondChar = letters[1] 
// error: subscript is unavailable, cannot subscript String with an Int
Run Code Online (Sandbox Code Playgroud)


And*_*rew 20

另一种选择是使用enumerated()例如:

let string = "Hello World"    
for (index, char) in string.characters.enumerated() {
    print(char)
}
Run Code Online (Sandbox Code Playgroud)

或者对于Swift 4只是使用

let string = "Hello World"    
for (index, char) in string.enumerated() {
    print(char)
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 7

使用以下内容:

for i in s.characters.indices[s.startIndex..<s.endIndex] {
  print(s[i])
}
Run Code Online (Sandbox Code Playgroud)

自从Swift 2.2迁移到Swift 2.3或Swift 3


djr*_*s70 6

在Swift 4中遍历字符串中的字符更干净:

let myString = "Hello World"    
for char in myString {
    print(char)
}
Run Code Online (Sandbox Code Playgroud)