rrbox / ecs-swift

Entity Component System for swift
MIT License
3 stars 0 forks source link

Filtered: 直接 `update` を呼び出す #56

Closed rrbox closed 4 months ago

rrbox commented 7 months ago

Filtered query の更新処理は、プロパティ query を1度介して実行する必要があります。

func system(query: Filtered<Query<Use>, With<NotUse>>) {
    query.query.update { _, use in
        // update `use`
    }
}

しかし Filtered という名称ではあるものの、実際は Query の一種として扱うことが多いかと思います(例えば、パラメータ名をquery, -Query にするなど)。

そこで filtered query についても query と同様に直接 update でコンポーネントを更新するようにした方が扱いやすいのでは、と提案します。

func system(query: Filtered<Query<Use>, With<NotUse>>) {
    query.update { _, use in
        // update `use`
    }
}
rrbox commented 5 months ago

Swift の限界により、現在はこの実装はできません。parameterized extension が実装されるのを待ちましょう

rrbox commented 5 months ago

Query protocol に associated type Update を追加することで実装できるかもしれません。 しかし、現時点の query にはデータ更新処理が2種類あります(entity 指定の更新とイテレーション方式の更新)。この2種類の更新処理は、受け取るクロージャの型が異なるため、associated type Update に相当する型も2種類定義する必要があります。

54 を採用した場合、この2種類のクロージャを1種類に統合できるようになるはずです。ということで、こちら #54 を優先しましょう。

rrbox commented 4 months ago

69 #63 で達成しました