diff --git a/Sources/FirebladeECS/Entity+Component.swift b/Sources/FirebladeECS/Entity+Component.swift index 900f785..9d4647e 100644 --- a/Sources/FirebladeECS/Entity+Component.swift +++ b/Sources/FirebladeECS/Entity+Component.swift @@ -31,4 +31,23 @@ extension Entity { let compC: C? = get(component: C.self) return (compA, compB, compC) } + + @inlinable + public subscript(_ componentKeyPath: WritableKeyPath) -> Value? { + nonmutating set { + guard var comp = self.get(component: C.self), + let value = newValue else { + return + } + comp[keyPath: componentKeyPath] = value + } + get { + self.get(component: C.self)?[keyPath: componentKeyPath] + } + } + + @inlinable + public subscript(_ componentType: C.Type) -> C? { + self.get(component: componentType) + } } diff --git a/Tests/FirebladeECSTests/EntityTests.swift b/Tests/FirebladeECSTests/EntityTests.swift index 878e173..2463026 100644 --- a/Tests/FirebladeECSTests/EntityTests.swift +++ b/Tests/FirebladeECSTests/EntityTests.swift @@ -81,6 +81,33 @@ class EntityTests: XCTestCase { XCTAssertEqual(generator.count, 1) } + + func testEntitySubscripts() { + let nexus = Nexus() + let pos = Position(x: 12, y: 45) + let name = Name(name: "SomeName") + let entity = nexus.createEntity(with: pos, name) + + XCTAssertEqual(entity[\Position.x], 12) + XCTAssertEqual(entity[\Position.y], 45) + XCTAssertEqual(entity[\Name.name], "SomeName") + + entity[\Position.x] = 67 + entity[\Position.y] = 89 + entity[\Name.name] = "AnotherName" + + XCTAssertEqual(entity[\Position.x], 67) + XCTAssertEqual(entity[\Position.y], 89) + XCTAssertEqual(entity[\Name.name], "AnotherName") + + entity[\Velocity.a] = 123 + XCTAssertNil(entity[\Velocity.a]) + + entity[Position.self]?.x = 1234 + XCTAssertEqual(entity[Position.self]?.x, 1234) + XCTAssertNil(entity[Velocity.self]?.a) + } + } extension Sequence { diff --git a/Tests/FirebladeECSTests/XCTestManifests.swift b/Tests/FirebladeECSTests/XCTestManifests.swift index 600fc6b..db9521b 100644 --- a/Tests/FirebladeECSTests/XCTestManifests.swift +++ b/Tests/FirebladeECSTests/XCTestManifests.swift @@ -29,6 +29,7 @@ extension EntityTests { ("testEntityEquality", testEntityEquality), ("testEntityIdentifierAndIndex", testEntityIdentifierAndIndex), ("testEntityIdGenerator", testEntityIdGenerator), + ("testEntitySubscripts", testEntitySubscripts), ("testRemoveAllComponentsFromEntity", testRemoveAllComponentsFromEntity) ] }