一尘不染

Swift 3.0在String.Index范围内迭代

swift

Swift 2.2可以实现以下功能:

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

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

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

我正在尝试对字符串进行快速的非常简单的操作-只需遍历字符串的前半部分(或更常见的问题:遍历字符串的范围)。

我可以执行以下操作:

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

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

for i in Range(s.startIndex..<s.midIndex) {
    print(s[i])
}

阅读 244

收藏
2020-07-07

共1个答案

一尘不染

您可以使用以下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
}

从“ 字符串和字符-计数字符”
部分的文档中:
__

扩展字素簇可以由一个或多个Unicode标量组成。这意味着不同的字符(以及同一字符的不同表示形式)可能需要存储不同数量的内存。因此,Swift中的字符在字符串表示中不会各自占用相同数量的内存。
结果,如果不迭代字符串 以确定其扩展字素簇边界, 就无法计算字符串中的字符数

强调是我自己的。

这将不起作用:

let secondChar = letters[1] 
// error: subscript is unavailable, cannot subscript String with an Int
2020-07-07