1. ホーム
  2. swift

[解決済み] 固定サイズのオブジェクトの配列を作成する方法

2022-10-08 05:40:19

質問

Swiftで、64個のSKSpriteNodeの配列を作ろうとしています。私は最初にそれを空に初期化したい、そして私は最初の16個のセルと最後の16個のセルにスプライトを置くでしょう(チェスゲームをシミュレートする)。

私がドキュメントで理解したことから、私は次のようなものを期待していました。

var sprites = SKSpriteNode()[64];

または

var sprites4 : SKSpriteNode[64];

しかし、うまくいきません。 2番目のケースでは、次のようなエラーが表示されます: "固定長配列はまだサポートされていません"。これは本当なのでしょうか?私には、それが基本的な機能のように思えるのですが。 私はそのインデックスで直接要素にアクセスする必要があります。

どのように解決するのですか?

固定長配列はまだサポートされていません。実際にはどうなのでしょうか?の配列が作れないというわけではありません。 n の配列を作れないわけではありません。 let a = [ 1, 2, 3 ] で3つの配列が得られます。 Int s. これは簡単に言うと、配列の大きさは を型情報として .

の配列が必要な場合 nil の配列が必要な場合は、まずオプションの型である [SKSpriteNode?] ではなく [SKSpriteNode] - を宣言した場合、それが配列であれ単一の値であれ、非選択型の変数を宣言することはできません。 nil . (また、以下のことに注意してください。 [SKSpriteNode?] とは異なる [SKSpriteNode]? ... オプションの配列ではなく、オプションの配列が必要です)。

Swiftは、初期化されていない参照の内容についての仮定が、C言語(といくつかの他の言語)のプログラムがバグを起こすことができる方法の1つであるので、変数が初期化されることを要求することについて、設計上非常に明示的です。そのため、明示的に [SKSpriteNode?] 配列に64個の nil s:

var sprites = [SKSpriteNode?](repeating: nil, count: 64)

これは実際には [SKSpriteNode?]? を返します。しかし、これはオプションのスプライトの配列です。(少し変ですね、なぜなら init(count:,repeatedValue:) はnilを返すことができないはずだからです)。この配列を扱うには、アンラップする必要があります。これを行うにはいくつかの方法がありますが、この場合、私はオプションのバインディング構文を好みます。

if var sprites = [SKSpriteNode?](repeating: nil, count: 64){
    sprites[0] = pawnSprite
}