2017-08-13 9 views
1

私はゾンビの配列を有するに基づいて構造体の配列のインデックスを検索し、以下のように、各ゾンビ構造体である:1つの成分SWIFT

struct Zombie { 
    var number: Int 
    var location : Int 
    var health : Int 
    var uid : String 
    var group: Int 
} 

私はゾンビの配列を有する

ZombieArray = [Zombie1, Zombie2, Zombie3] 

zombieHealthが変更されたら更新する必要がありますが、最初のゾンビを見つける必要があります。各ゾンビの位置、番号、およびUIDは一意であるため、それらのいずれかを検索することができます。私が試したし、エラーを得たもの。ここです:

let zombieToUpdate : Zombie? 

for zombieToUpdate in self.zombieArray { 
    if zombieToUpdate.location == thisZombieLocation { 
     let indexOfUpdateZombie = zombieArray.indexOf(zombieToUpdate) 
     self.zombieArray.remove(at: indexOfUpdateZombie) 
     self.zombieArray.append(thisNewZombie) 
    } 
} 

私は次のエラーを取得しています:

Cannot convert value of type 'Zombie' to expected argument type '(Zombie) throws -> Bool'

このエラーは、ライン上に発生します。

let indexOfUpdateZombie = zombieArray.indexOf(zombieToUpdate) 
+0

がスイフト3で、それは(の)'指標であろう。 – rmaddy

+0

私はそれを試して、次のようなことを知っています: '(of:Zombie)'の引数リストで 'index'を呼び出せません ' –

+0

あなたのタイプをEquatableにするか、 'index(where:predicate)'を使用してください... https: /stackoverflow.com/questions/24028860/how-to-find-index-of-list-item-in-swift –

答えて

1

Zombieは準拠していないので、 Equatableには、index(of:)は使用できません。

この機能を追加したくない場合は、ロジックを実装するためにいくつかの選択肢があります。

オプション1 - 利用index(where:)

if let index = zombieArray.index(where: { $0.location == thisZombieLocation }) { 
    zombieArray.remove(at: index) 
    zombieArray.append(thisNewZombie) 
} 

ループの必要はありません。

オプション2 - インデックスに反復: `ない`のindexOf() `:

for index in 0..<zombieArray.count { 
    let zombieToUpdate = zombieArray[index] 
    if zombieToUpdate.location == thisZombieLocation { 
     zombieArray.remove(at: index) 
     zombieArray.append(thisNewZombie) 
     break // no need to look at any others 
    } 
} 
関連する問題