当前位置: 首页 > 知识库问答 >
问题:

带增量的循环的Swift 3

元望
2023-03-14

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

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

这是我自己的尝试

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

共有3个答案

井唯
2023-03-14

简单地说,Swift 3.0的工作代码:

let (first, last, interval) = (0, 100, 1)
var n = 0
for _ in stride(from: first, to: last, by: interval) {
    n += 1
}
云星波
2023-03-14

使用Swift 5,您可以从以下5个示例中选择一个来解决您的问题。

let first = 0
let last = 10
let interval = 2

let sequence = stride(from: first, to: last, by: interval)

for element in sequence {
    print(element)
}

/*
prints:
0
2
4
6
8
*/
let first = 0
let last = 10
let interval = 2

let unfoldSequence = sequence(first: first, next: {
    $0 + interval < last ? $0 + interval : nil
})

for element in unfoldSequence {
    print(element)
}

/*
prints:
0
2
4
6
8
*/
let anySequence = AnySequence<Int>({ () -> AnyIterator<Int> in
    let first = 0
    let last = 10
    let interval = 2

    var value = first
    return AnyIterator<Int> {
        defer { value += interval }
        return value < last ? value : nil
    }
})

for element in anySequence {
    print(element)
}

/*
prints:
0
2
4
6
8
*/
let first = 0
let last = 10
let interval = 2

let range = first ..< last
let lazyCollection = range.lazy.filter({ $0 % interval == 0 })

for element in lazyCollection {
    print(element)
}

/*
prints:
0
2
4
6
8
*/
let first = 0
let last = 10
let interval = 2

let range = first ..< last
let lazyCollection = range.lazy.compactMap({ $0 % interval == 0 ? $0 : nil })

for element in lazyCollection {
    print(element)
}

/*
prints:
0
2
4
6
8
*/
卫弘图
2023-03-14

在Swift 2.2中,我们可以(正如您在自己的尝试中所尝试的那样)利用协议中的stride(通过:by:)stride(到:by:)功能

/* 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中,这两个功能已从可移动的中删除,以支持全局功能stride(from:to:by:)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) { }

在您的示例中,您希望使用闭合间隔步幅备选方案步幅(from:to: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循环到跨步的一个示例,因为您可以自然地,对于您的特定示例,只计算n,而不需要循环(n=1(最后一个第一)/间隔)。

随着进化建议SE-0094的实施,Swift 3.0引入了全局序列函数:

  • 序列(第一个:下一个:)

对于具有更复杂的迭代增量关系的情况(本例中不是这种情况),这可能是跨步的合适替代方案。

声明(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参数采用一个闭包,该闭包应用一些逻辑来懒惰地构造给定当前序列元素的下一个序列元素(从first开始)。当Next返回nil或无限时,如果Next从不返回nil,则序列终止。

应用于上述简单的恒定步幅示例,sequence方法有点冗长和过度。适合此目的的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

然而,序列功能对于非恒定步幅的情况非常有用,例如,如以下Q中所述的示例

  • swift中的快速循环和动态范围

只需注意使用最终的nil返回终止序列(如果不是:“无限”元素生成),或者,当Swift 3.1到达时,结合序列的前缀(while:)方法使用其惰性生成,如进化提案SE-0045所述。后者应用于这个答案的运行示例,使得序列方法不那么冗长,显然包括元素生成的终止标准。

/* 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

 类似资料:
  • 问题内容: 如何从内部循环增加外部迭代器? 更准确地说: 我正进入(状态 , 但是我想要 上面是我想要实现的简化想法。 这是我的Java代码: 问题答案: 似乎您想使用范围功能的step参数。从文档: range(start,stop [,step])这是创建包含算术级数的列表的通用功能。它最常用于for循环中。参数必须是纯整数。如果省略了step参数,则默认值为1。如果省略了start参数,则默

  • 循环中的和有区别吗?这仅仅是语法问题吗?

  • 问题内容: 我正在做一些有关Java的研究,发现这很令人困惑: 这是永无止境的循环! 有人很好地解释了为什么会发生这种事情吗? 问题答案: 上面的循环与以下内容基本相同:- 3 次你的一部分声明- ,被评估为: - 您需要从此处删除分配,以使其起作用:- (根据评论的OP请求) 的行为:- 就注释中指定的问题而言,以下表达式的结果:- 获得如下:- 让我们标记第二条语句的不同部分:- 现在,首先将

  • 问题内容: 我不明白为什么这个职位增加方程不增加。我以为在+=操作之后,该值将增加1,然后围绕i的第二次将具有1值。但是输出是一个零零的无限循环。有谁能解释为什么“ i”不增加。 问题答案: @ njzk2的答案是正确的,但指出正确的 原因 很有用。 还有其他可能性-例如,为什么Java在分配后不执行postincrement运算符?(答案:因为那不是Java语言设计者选择的) Java语言规范第

  • 我正在逐个迭代字符串对象列表中的元素: 在这里,每次我调用list上的get()时,列表都会从其一端一直迭代到第i个元素——因此上面循环的复杂性是O(n^2)。 是a.)对于增强型for循环,与上面相同,还是b.)对于循环,将指针保持在最后一个指针所在的位置,因此下面循环的复杂性是O(n)? 如果上面的情况(b)——我想是这样的——在列表上使用迭代器有什么好处吗。这是简单的迭代--没有回头路 蒂亚

  • 问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问