Added closure-based initializer function for Vector and corresponding unit test

This commit is contained in:
Vincent Esche 2019-10-02 01:29:12 +02:00
parent 2d370f39de
commit 254da517d9
2 changed files with 34 additions and 0 deletions

View File

@ -46,6 +46,17 @@ public struct Vector<Scalar> where Scalar: FloatingPoint, Scalar: ExpressibleByF
self.dimensions = scalars.count self.dimensions = scalars.count
self.scalars = scalars self.scalars = scalars
} }
public init(dimensions: Int, _ closure: (Int) throws -> Scalar) rethrows {
var scalars: [Scalar] = []
scalars.reserveCapacity(dimensions)
for index in 0..<dimensions {
scalars.append(try closure(index))
}
self.init(scalars)
}
} }
// MARK: - ExpressibleByArrayLiteral // MARK: - ExpressibleByArrayLiteral

View File

@ -27,6 +27,19 @@ import XCTest
class VectorTests: XCTestCase { class VectorTests: XCTestCase {
// MARK: - Initialization // MARK: - Initialization
func test_init_dimensions_repeatedValue() {
typealias Scalar = Double
let dimensions = 5
let repeatedValue: Scalar = 42
let actual: Vector<Scalar> = Vector(dimensions: dimensions, repeatedValue: repeatedValue)
let expected: Vector<Scalar> = [42, 42, 42, 42, 42]
XCTAssertEqual(actual, expected)
}
func test_init() { func test_init() {
typealias Scalar = Double typealias Scalar = Double
@ -36,6 +49,16 @@ class VectorTests: XCTestCase {
XCTAssertEqual(lhs.scalars, values) XCTAssertEqual(lhs.scalars, values)
} }
func test_init_dimensions_closure() {
typealias Scalar = Double
let dimensions = 5
let actual: Vector<Scalar> = Vector(dimensions: dimensions) { Scalar($0) }
let expected: Vector<Scalar> = [0, 1, 2, 3, 4]
XCTAssertEqual(actual, expected)
}
// MARK: - Subscript // MARK: - Subscript
func test_subscript() { func test_subscript() {