Swift 3:如何使用 for 循环来循环数组

Posted

技术标签:

【中文标题】Swift 3:如何使用 for 循环来循环数组【英文标题】:Swift 3 : How to use for loop for looping arrays 【发布时间】:2017-02-01 08:37:44 【问题描述】:

场景

假设我有一个array = ["a", "b", "c", "d"]

我有一个button 函数,它允许我打印此数组中的数据。我使用 for 循环遍历数组。

但是在第四次点击打印最后一个数组元素(index[3])之后,我希望它在第五次点击时从头开始打印(index[0])。

非常感谢任何帮助!

谢谢

【问题讨论】:

不相关的问题标题 【参考方案1】:

为此,您只需维护数组对象的当前元素的索引。

var currentIndex = 0

@IBAction func buttonClick(_ sender: UIButton) 
    print(array[currentIndex])
    currentIndex += 1
    if currentIndex == array.count  
        currentIndex = 0 
    

【讨论】:

这应该是一条评论。 @VishalSonawane 已编辑答案。 @VishalSonawane :)【参考方案2】:

保持点击计数变量(初始化为 0)并在点击按钮时使用以下内容:

let valToPrint = yourArray[clickCount % yourArray.count]
clickCount += 1

print("Current value = \(valToPrint)")

%(模)运算符将循环clickCount 通过所需的范围。

【讨论】:

如果我将 var clickCount 初始化为 0,则该值根本不会改变。我应该如何初始化它? @Meebfel 如果clickCount 被声明为var 那么你当然可以改变它。也许你在函数内部声明它。如果是这样,请将其移到函数之外。 @Adeel 他是对的。如果 clickCount 将被初始化为零,那么由于运算符的结果,模运算符将始终将其重置为零。编辑答案现在可以正常工作。【参考方案3】:

你可以写

let letters =  ["a", "b", "c", "d"]
var index = 0

func printNext() 
    print(letters[index])
    index = (index + 1) % letters.count

【讨论】:

啊是的,当然,我浏览的太快了,相信你直接使用了索引余数!【参考方案4】:

在按钮点击时写下代码

@IBAction func myButton(_ sender: UIButton) 

    if sender.tag > array.count
        sender.tag = 0
    

    print("array[\(sender.tag)] = \(array[sender.tag])")
    sender.tag += 1


【讨论】:

【参考方案5】:

为了技术上的乐趣:另一种选择是定义一个循环遍历数组元素的序列。

给定一个不可变数组:

class Foo 
    private let array: [String]

    private lazy var cyclingSequenceOverArray: 
        UnfoldSequence<String, Int> = sequence(state: -1) 
        (state: inout Int) -> String? in
        guard !self.array.isEmpty else  return nil 
        return self.array[(state = (state + 1) % self.array.count, state).1]
    

    init(_ array: [String]) 
        self.array = array
    

    func printNext() 
        if let next = cyclingSequenceOverArray.next() 
            print(next)
        
    


let foo = Foo(["a", "b", "c", "d"])

foo.printNext() // a
foo.printNext() // b
foo.printNext() // c
foo.printNext() // d
foo.printNext() // a
foo.printNext() // b

如果您让数组是可变的 (var) 并且它永远为空:调用序列的 next() 方法(如上实现)将终止序列。即,即使要重新填充数组,对next() 的后续调用仍会产生nil。在这种情况下,您可以让序列是无限的(永不终止),只需返回一个默认值以防数组为nil

class Foo 
    var array: [String]

    private lazy var cyclingSequenceOverArray: 
        UnfoldSequence<String, Int> = sequence(state: -1) 
        (state: inout Int) -> String in
        guard !self.array.isEmpty else  return (state = -1, "Empty!").1 
        return self.array[(state = (state + 1) % self.array.count, state).1]
    

    init(_ array: [String]) 
        self.array = array
    

    func printNext() 
        if let next = cyclingSequenceOverArray.next() 
            print(next)
        
    

示例用法:

let foo = Foo(["a", "b", "c", "d"])

foo.printNext() // a
foo.printNext() // b
foo.printNext() // c

foo.array = []

foo.printNext() // Empty!
foo.printNext() // Empty!

foo.array = ["a", "b", "c", "d"]

foo.printNext() // a
foo.printNext() // b
foo.array[2] = "C"
foo.printNext() // C

foo.array = ["1", "2", "3"]

foo.printNext() // 1

【讨论】:

以上是关于Swift 3:如何使用 for 循环来循环数组的主要内容,如果未能解决你的问题,请参考以下文章

For循环用于搜索数组,Swift [重复]

如何使用循环反转numpy数组

三种for循环:就这三种

由于 swift 中的 for 循环而无法修改数组?

如何延迟 For 循环直到声音在 Swift 中播放完毕

不能在 swift 中使用 for...in 或 forEach 循环来快速打印视图