gpt4 book ai didi

swift - 在 swift 中表达具有动态范围的 for 循环

转载 作者:行者123 更新时间:2023-11-30 12:56:46 38 4
gpt4 key购买 nike

...或者如何在 for 循环条件内使用索引

大家好由于 swift 3 中没有 c 风格的 for 循环,我似乎找不到一种方法来表达更复杂的 for 循环,所以也许你可以帮助我。

如果我写这个

for(int i=5; num/i > 0; i*=5)

在 swift 3 中我该怎么做?

我的结束是:

for i in stride(from: 5, through: num, by: 5) where num/i > 0 

但是如果我是:5、25、125 等,这当然会一次迭代 5 个 block 。

有什么想法吗?

谢谢

最佳答案

使用辅助函数(最初定义于 Converting a C-style for loop that uses division for the step to Swift 3 )

public func sequence<T>(first: T, while condition: @escaping (T)-> Bool, next: @escaping (T) -> T) -> UnfoldSequence<T, T> {
let nextState = { (state: inout T) -> T? in
// Return `nil` if condition is no longer satisfied:
guard condition(state) else { return nil }
// Update current value _after_ returning from this call:
defer { state = next(state) }
// Return current value:
return state
}
return sequence(state: first, next: nextState)
}

你可以将循环写为

let num = 1000
for i in sequence(first: 5, while: { num/$0 > 0 }, next: { $0 * 5 }) {
print(i)
}

更简单的解决方案是 while 循环:

var i = 5
while num/i > 0 {
print(i)
i *= 5
}

但是第一种方案的优点是循环变量的作用域仅限于循环体,并且循环变量是一个常量。

Swift 3.1 将提供 prefix(while:) method for sequences ,然后辅助函数就不再需要了:

let num = 1000
for i in sequence(first: 5, next: { $0 * 5 }).prefix(while: { num/$0 > 0 }) {
print(i)
}
<小时/>

以上所有解决方案都“等效于”给定的 C 循环。但是,如果num接近Int.max,它们都可能崩溃和 $0 * 5 溢出。如果这是一个问题,那么你必须检查如果$0 * 5在进行乘法之前符合整数范围。

实际上,这使得循环更简单 - 至少如果我们假设num >= 5 以便循环至少执行一次:

for i in sequence(first: 5, next: { $0 <= num/5  ? $0 * 5 : nil }) {
print(i)
}

关于swift - 在 swift 中表达具有动态范围的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324275/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com