gpt4 book ai didi

带有增量的 Swift 3 for 循环

转载 作者:IT王子 更新时间:2023-10-29 05:01:20 25 4
gpt4 key购买 nike

如何在 Swift3 中编写以下内容?

for (f = first; f <= last; f += interval)          
{
n += 1
}

这是我自己的尝试

for _ in 0.stride(to: last, by: interval)
{
n += 1
}

最佳答案

swift 2.2 -> 3.0:Strideable :s stride(...)替换为全局 stride(...)函数

在 Swift 2.2 中,我们可以(正如您自己尝试过的那样)使用蓝图(和默认实现的)函数 stride(through:by:)stride(to:by:) from the protocol Strideable

/* Swift 2.2: stride example usage */
let from = 0
let to = 10
let through = 10
let by = 1
for _ in from.stride(through, by: by) { } // from ... through (steps: 'by')
for _ in from.stride(to, by: by) { } // from ..< to (steps: 'by')

而在 Swift 3.0 中,这两个函数已从 Strideable 中删除赞成the global functions stride(from:through:by:) and stride(from:to:by:) ;因此,上面的等效 Swift 3.0 版本如下

/* Swift 3.0: stride example usage */
let from = 0
let to = 10
let through = 10
let by = 1
for _ in stride(from: from, through: through, by: by) { }
for _ in stride(from: from, to: to, by: by) { }

在您的示例中,您想使用闭区间步幅替代方案 stride(from:through:by:) ,因为你的不变量for循环使用与小于或等于(<=)的比较。即

/* example values of your parameters 'first', 'last' and 'interval' */
let first = 0
let last = 10
let interval = 2
var n = 0
for f in stride(from: first, through: last, by: interval) {
print(f)
n += 1
} // 0 2 4 6 8 10
print(n) // 6

当然,我们会在哪里使用您的 for循环仅作为来自 for 的段落的示例循环到 stride ,对于您的具体示例,您自然可以计算 n无需循环 ( n=1+(last-first)/interval )。

Swift 3.0:stride 的替代品对于更复杂的迭代增量逻辑

the implementation of evolution proposal SE-0094 , Swift 3.0 引入了全局 sequence功能:

这可以是 stride 的合适替代品对于具有更复杂的迭代增量关系的情况(在本例中不是这种情况)。

Declaration(s)

func sequence<T>(first: T, next: @escaping (T) -> T?) -> 
UnfoldSequence<T, (T?, Bool)>

func sequence<T, State>(state: State,
next: @escaping (inout State) -> T?) ->
UnfoldSequence<T, State>

我们将简要介绍这两个函数中的第一个。 next arguments 采用一个闭包,它应用一些逻辑来延迟构造给定当前序列元素的下一个序列元素(从 first 开始)。当 next 时序列终止。返回 nil , 或无限,如果 next永不返回 nil .

应用于上面简单的恒定步幅示例,sequence方法有点冗长和矫枉过正 w.r.t.适合这个目的stride解决方案:

let first = 0
let last = 10
let interval = 2
var n = 0
for f in sequence(first: first,
next: { $0 + interval <= last ? $0 + interval : nil }) {
print(f)
n += 1
} // 0 2 4 6 8 10
print(n) // 6

sequence然而,函数对于非恒定步幅的情况变得非常有用,例如如以下问答中的示例所示:

只需注意以最终的 nil 终止序列返回(如果不是:“无限”元素生成),或者,当 Swift 3.1 到来时,结合使用其延迟生成和 prefix(while:)序列方法,如进化提案中所述SE-0045 .后者应用于此答案的运行示例使得 sequence方法不那么冗长,清楚地包括元素生成的终止标准。

/* for Swift 3.1 */
// ... as above
for f in sequence(first: first, next: { $0 + interval })
.prefix(while: { $0 <= last }) {
print(f)
n += 1
} // 0 2 4 6 8 10
print(n) // 6

关于带有增量的 Swift 3 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37170203/

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