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

快速循环快速,动态范围

李俊雅
2023-03-14

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

嘿,伙计们,因为我们在Swift 3中没有c风格的循环,我似乎找不到一种方法来表达更复杂的循环,所以也许你可以帮我。

如果我要写这个

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个块,而不是如果我是:5、25、125等。

有什么想法吗?

谢谢

共有2个答案

邹华皓
2023-03-14

为了完整起见:除了< code>while循环方法之外,还可以使用< code>AnyIterator:

let num = 1000

var i = 5
for i in AnyIterator<Int>({
    return i <= num ? { defer { i *= 5 }; return i }() : nil
}) {
    // note that we choose to shadow the external i variable name,
    // such that any access to i within this loop will only refer
    // to the loop local immutable variable i.
    print(i)

    // e.g. i += 1 not legal, i refers to a constant here!

} /* 5 
     25 
     125 
     625 */

此方法与< code>while循环具有相同的缺点,因为循环“外部”< code>i变量存在于循环块范围之外和之后。然而,这个外部< code>i变量不是可在循环体内访问的< code>i变量,因为我们让循环体变量< code>i隐藏外部变量,将对体内< code>i的访问限制为不可变的、临时的(循环范围局部)变量。

孟韬
2023-03-14

使用helper函数(最初在将步骤使用除法的C样式for循环转换为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将为序列提供前缀(同时:)方法,然后不再需要helper函数:

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是否符合整数范围。

实际上这使得循环更简单-

for i in sequence(first: 5, next: { $0 <= num/5  ? $0 * 5 : nil }) {
    print(i)
}
 类似资料:
  • 问题内容: …或者如何在for循环条件中使用索引 大家好,因为我们在Swift 3中没有使用c风格的循环,所以我似乎找不到一种表达一些复杂的循环的方法,所以也许您可以帮我一下。 如果我要写这个 快速3我该怎么做? 我的关闭时间是: 但这当然会一次迭代5个块,如果我是:5、25、125等。 有任何想法吗? 谢谢 问题答案: 使用辅助函数(最初在将使用除法的C样式for循环转换为Swift3时定义 您

  • 问题内容: 在ViewController.Swift中,我设法使一个盒子从一个点动画到另一个点。我认为将其循环很容易,因此框将动画到一个点,然后再动画回到其原始位置,然后再次循环。我已经设法将对象移到某个位置,并在“完成”后再次将其移回,但这并没有使我循环。如何做到这一点? 我以为这也许行得通,但老实说我不知道​​: 如何根据设备宽度居中(我假设涉及数学运算?)? 我的代码: 问题答案: 无需执

  • Swoole的绝大部分功能只能用于cli命令行环境,请首先准备好Linux Shell环境。可使用vim、emacs、phpstorm或其他编辑器编写代码,并在命令行中通过下列指令执行程序。 php /path/to/your_file.php 成功执行Swoole服务器程序后,如果你的代码中没有任何echo语句,屏幕不会有任何输出,但实际上底层已经在监听网络端口,等待客户端发起连接。可使用相应的

  • Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。 如果不想使用 Spring 配置,可以通过 API 的方式 进行调用。 服务提供者 完整安装步骤,请参见:示例提供者安装 定义服务接口 DemoService.java 1: package

  • 问题内容: 我正在Swift中编写一些性能关键的代码。在实现了我能想到的所有优化并在Instruments中对应用程序进行了性能分析之后,我意识到,绝大多数CPU周期都花在了Floats数组上的执行和操作上。所以,只是为了看看会发生什么,我更换的所有实例,并具有良好的老式循环。令我惊讶的是,循环快得多了! 对此感到有些困惑,我决定执行一些粗略的基准测试。在一个测试中,我执行了一些简单的算术,然后返

  • 我正在用Swift编写一些性能关键的代码。在实现了我能想到的所有优化,并在仪器中分析了应用程序之后,我意识到绝大多数CPU周期都花在了对浮点数组执行和操作上。因此,为了看看会发生什么,我用良好的老式循环替换了和的所有实例。令我吃惊的是...循环要快得多! 的平均执行时间:20.1秒。循环的平均执行时间:11.2秒。使用整数而不是浮点的结果是相似的。 我创建了一个类似的基准测试Swift的的性能。这

  • 我需要将动态查询参数发送到 REST Web 服务 GET 方法[如下所示]。 主机:端口/应用程序?字段1=值1 消费者可以将参数发送到字段和值。每个字段都映射到值。 有了这种类型的要求,我无法在服务器端方法上编写一组有限的 QueryParams。 我在用python和fastapi 谢谢你。

  • 问题内容: 我想在项目中使用sha256,但是在将objC代码重写为快速代码时遇到了一些麻烦。 这是我的代码 它给我的错误,因为一切都迅速不能转换到,例如。 问题答案: 您必须在和之间进行显式转换,因为Swift不会像(Objective-)C中那样进行隐式转换。 您还必须定义为所需大小的数组。 另外,您可以用来分配所需的缓冲区: Swift 3和4的更新: Swift 5更新: