有效地聚合一组非选项而没有默认值

时间:2015-11-13 07:18:26

标签: swift

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

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

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?>的结果不会,我需要非选项。另请注意,解决方案必须高效,不得进行任何额外的遍历。

1 个答案:

答案 0 :(得分:2)

您可以使用示例代码创建工作函数 添加数组元素的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

但使用map()的{​​{1}}方法更容易:

CollectionType

在你的情况下:

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