gpt4 book ai didi

swift - 有效地聚合一个没有默认值的非可选数组

转载 作者:行者123 更新时间:2023-11-28 13:01:46 25 4
gpt4 key购买 nike

我需要有效地聚合一个非可选值数组,知道它的大小,有办法获取它的值,但没有默认值。

以下是一个相当综合的示例,类似于我所需要的。它不会编译,但它会给你一个想法:

public func array<A>( count: Int, getValue: () -> A ) -> Array<A> {
var array = [A](count: count, repeatedValue: nil as! A)
var i = 0
while (i < count) {
array[i] = getValue()
i++
}
return array
}

请注意 Array<A?> 类型的结果不行,我需要非选项。另请注意,解决方案必须高效,不得进行任何额外的遍历。

最佳答案

您可以通过使用append() 方法添加数组元素:

public func array<A>(count: Int, @noescape getValue: () -> A) -> [A] {
var array = [A]()
array.reserveCapacity(count)
for _ in 0 ..< count {
array.append(getValue())
}
return array
}

@noescape属性告诉编译器传递的闭包不会长寿函数调用,这允许一些性能优化,比较 @noescape attribute in Swift 1.2 .

但是使用CollectionTypemap()方法更简单:

/// Return an `Array` containing the results of mapping `transform`
/// over `self`.
///
/// - Complexity: O(N).
@warn_unused_result
public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]

在你的情况下:

public func array<A>(count: Int, @noescape getValue: () -> A) -> [A] {
let array = (0 ..< count).map { _ in getValue() }
return array
}

此处 map() 转换范围 0 ... count-1 中的每个整数到数组元素。闭包中的下划线表示它的参数(当前索引)未被使用。

我留给您检查哪种方法更快。

示例用法:

let a = array(10) { arc4random_uniform(10) }
print(a) // [3, 7, 9, 4, 2, 3, 1, 5, 9, 7] (Your output may be different :-)

关于swift - 有效地聚合一个没有默认值的非可选数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687603/

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