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 循环来循环数组的主要内容,如果未能解决你的问题,请参考以下文章