Swift 3.0迭代String.Index范围

时间:2016-07-15 02:27:00

标签: swift swift3

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

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

使用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])

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

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

9 个答案:

答案 0 :(得分:26)

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

来自字符串和字符中的documentation - 计算字符

  

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

强调是我自己的。

这不起作用:

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

答案 1 :(得分:18)

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

let string = "Hello World"    
for (index, char) in string.characters.enumerated() {
    print(char)
}

或者对于Swift 4,只需使用

let string = "Hello World"    
for (index, char) in string.enumerated() {
    print(char)
}

答案 2 :(得分:7)

使用以下内容:

for i in s.characters.indices[s.startIndex..<s.endIndex]
{
  print(s[i])
}

取自Migrating to Swift 2.3 or Swift 3 from Swift 2.2

答案 3 :(得分:5)

在Swift 4中迭代字符串中的字符更加清晰:

let myString = "Hello World"    
for char in myString {
    print(char)
}

答案 4 :(得分:3)

如果您想遍历String的字符,那么您可以简单地使用{{1}的CharacterView,而不是显式访问String的索引。 }},符合CollectionType,允许您访问整齐的子序列方法,例如String等。

prefix(_:)

如果您想将循环中的字符视为字符串,只需使用上面的/* traverse the characters of your string instance, up to middle character of the string, where "middle" will be rounded down for strings of an odd amount of characters (e.g. 5 characters -> travers through 2) */ let m = "alpha" for ch in m.characters.prefix(m.characters.count/2) { print(ch, ch.dynamicType) } /* a Character l Character */ /* round odd division up instead */ for ch in m.characters.prefix((m.characters.count+1)/2) { print(ch, ch.dynamicType) } /* a Character l Character p Character */

关于您的评论如下:如果您想要访问String(ch)的范围,您可以轻松实现自己的CharacterView扩展名(在CollectionType时指定) Generator.Element}使用Characterprefix(_:)生成一个子集合,例如半开(suffix(_:))范围

from..<to

答案 5 :(得分:1)

最好的方法是: -

 let name = "nick" // The String which we want to print.

  for i in 0..<name.count 
{
   // Operation name[i] is not allowed in Swift, an alternative is
   let index = name.index[name.startIndex, offsetBy: i]
   print(name[index])
}

有关详细信息,请访问here

答案 6 :(得分:0)

迅速4:

let mi: String = "hello how are you?"
for i in mi {
   print(i)
}

答案 7 :(得分:0)

要具体演示如何在Swift 4中遍历字符串中的某个范围,我们可以在where循环中使用for过滤器将其执行过滤到指定范围:

func iterateStringByRange(_ sentence: String, from: Int, to: Int) {

    let startIndex = sentence.index(sentence.startIndex, offsetBy: from)
    let endIndex = sentence.index(sentence.startIndex, offsetBy: to)

    for position in sentence.indices where (position >= startIndex && position < endIndex) {
        let char = sentence[position]
        print(char)
    }

}

iterateStringByRange("string", from: 1, to: 3)将打印tri

答案 8 :(得分:0)

Swift 4.2

简单地:

let m = "alpha"
for i in m.indices {
   print(m[i])
}