假设我想创建一个函数,给定一个数字数组,以异步方式计算每个数字的平方、立方和四次方,并返回所有这些结果的平坦、异步序列.

因此,例如,对于输入数组[2, 3, 4],它应该返回一个AsyncSequence实例,生成元素[4, 8, 16, 9, 27, 81, 16, 64, 256].

然后让我们假设,不是计算x^2, x^3, x^4,而是计算x, x^2, x^3, ..., x^k,其中k是一种随机整数,对于每个x可以不同,并且事先未知(其值只有在计算幂时才知道).我将如何实现这样的模式?

推荐答案

非常感谢Rob提供了关于如何实现这样的东西的基本 idea .

我是这样写的:

func powers(of numbers: [Int]) -> AsyncStream<Int> {
    return AsyncStream<Int> { continuation in
        Task {
            for number in numbers {
                for await power in Powers(of: number) {
                    continuation.yield(power)
                }
            }
            continuation.finish()
        }
    }
}

struct Powers: AsyncSequence {
    init(of base: Int) {
        self.base = base
    }
    
    func makeAsyncIterator() -> PowersIterator {
        return PowersIterator(base: self.base)
    }
    
    let base: Int
    typealias Element = Int
}

struct PowersIterator: AsyncIteratorProtocol {
    mutating func next() async -> Int? {
        if !self.shouldFinish() {
            try? await Task.sleep(nanoseconds: 1_000_000_000)
            defer {
                self.exponent += 1
            }
            return power(self.base, self.exponent)
        } else {
            return nil
        }
    }
    
    private func shouldFinish() -> Bool {
        return Int.random(in: 1...10) == 1
    }
    
    private func power(_ base: Int, _ exponent: UInt) -> Int {
        return (0..<exponent).reduce(1) { power, _ in power * base }
    }
    
    var exponent = UInt(1)
    let base: Int
}

可以使用以下代码调用它:

Task {
    let numbers = [1, 2, 3, 4, 5]
    for await power in powers(of: numbers) {
        print(power, terminator: " ")
    }
}

可能输出:

1 1 1 2 4 8 16 32 64 3 9 27 4 16 64 256 5 25 125 625 3125 15625

解决方案比应该的要复杂一点.但这当然是因为我实际上想要计算一些真正需要异步计算的东西,并且具有与本例相同的计算 struct .这也是为什么我创建了一个单独的异步序列来计算功率的原因.

如果这对任何人都有帮助,我会很高兴.

Swift相关问答推荐

AirPods手势不发送AVAudioApp静音状态通知

SwiftData:线程1:&Quot;NSFetchRequest找不到实体名称';提醒&q;的NSEntityDescription

SWIFT:使字典数组值可变

从Swift中的泛型类继承?

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

应该在ViewModel还是ViewController中使用"Task {}"?

在Swift中如何用变量计算0.9的立方

为什么我的 tableView 没有推送到 tableView 内的 detailViewController?

将弱引用作为类函数引用传递时,弱引用无法按预期工作

SwiftUI:按钮的圆形边缘的边框尺寸加倍

如何让飞机与 RealityKit 中的物体相撞

如何自己实现同一个 iOS 16 锁屏圆形小部件?

如何在一个视图控制器中创建具有相同行为的多个集合视图?

将阻塞函数集成到 Swift 异步中

如何防止 UITableViewCell 移动(Swift 5)

subscribeOn 和 observeOn 的顺序重要吗?

两个 Date 对象之间的所有日期 (Swift)

Facebook SDK 4.0 IOS Swift 以编程方式注销用户

如何在 SwiftUI Segmented Picker 中更改选定的段 colored颜色

如何在swift中的每N个字符处为字符串添加分隔符?