在 Swift 的嵌套循环中从特定索引枚举字符串

Posted

技术标签:

【中文标题】在 Swift 的嵌套循环中从特定索引枚举字符串【英文标题】:Enumerate String from specific index in nested loop in Swift 【发布时间】:2020-01-28 09:12:30 【问题描述】:

使用enumerated()方法从String获取字符

let str = "Hello"

for (i,val) in str.enumerated() 
        print("\(i) -> \(val)")

现在尝试在 for 循环中枚举相同的字符串,但从 i 位置如

for (i,val) in str.enumerated() 
        print("\(i) -> \(val)")
        for (j,val2) in str.enumerated() 
            // val2 should be from i postion instead starting from zero
        

如何枚举和设置j的位置应该从i开始?

谢谢

【问题讨论】:

【参考方案1】:

您可以使用dropFirst() 在字符串中以特定位置开始创建视图:

for (i,val) in str.enumerated() 
    print("i: \(i) -> \(val)")
    for (j, val2) in str.dropFirst(i).enumerated() 
        print("j: \(i+j) -> \(val2)")
    

如果要获取原始字符串对应的索引,则需要在第二个循环中添加i,否则j将持有dropFirst()创建的视图中的索引

【讨论】:

【参考方案2】:

您可以使用for instr.indices 并在外部循环的基础上启动内部循环。

let str = "abc"

for i in str.indices 
    for j in str[i...].indices 
        print(str[j])
    

输出:a b c b c c


(来自@LeoDabus的建议)

【讨论】:

这是预期的,因为 enumerated() 方法返回偏移量而不是索引。请注意,每次迭代都会不必要地从 startIndex 偏移索引。顺便说一句,您也应该将 StringProtocol 或集合本身扩展到 englobe 子字符串。查看此帖子***.com/a/54877538/2303865 for index in str.indices for idx in str[index...].indices print(str[idx]) 【参考方案3】:

如果我正确理解了问题陈述,则 OP 需要这个 -

你好你好lloloo

我们可以使用苹果提供的suffix方法。

let str = "Hello"
var lengthOfString = str.count

for (i, val) in str.enumerated() 
    print(String(str.suffix(lengthOfString - i)))

我们不需要上面for循环中的val,所以我们可以重写上面的for循环如下。

var str = "Hello"
var lengthOfString = str.count

for i in 0..<lengthOfString 
    print(String(str.suffix(lengthOfString - i)))

上述两个 for 循环都会给出相同的期望输出。

【讨论】:

以上是关于在 Swift 的嵌套循环中从特定索引枚举字符串的主要内容,如果未能解决你的问题,请参考以下文章

Swift学习笔记-内嵌类型与不透明类型

Swift学习:嵌套类型

swift 学习- 22 -- 嵌套类型

在java Android中获取JSON嵌套对象的特定索引

Swift 类型嵌套

在 Swift 3 和 Xcode 8 中从嵌套字典中获取值的问题