2014-08-15 8 views
0

Я делаю простую игру, чтобы лучше знать новый язык, я сделал перечисление, которое описывает уровни игры. Я хочу сделать еще одно перечисление, которое будет описывать врагов на каждом уровне (уровни имеют разных врагов). Итак, я хочу, чтобы архивировать что-то вроде этого:Swift: enum зависит от другого перечисления

enum GameLevel : Int { 

    case Forest = 0, Swamp, Castle 
    ... 
} 

enum Enemies : Int { 

    // if .Forest than 
    case Stump = 0, Frog // Forest Enemies 

    //esle if ... 
    case Zombie = 0, Witch // Swamp Enemies 
    case Knight = 0, Archer // Castle Enemies 


    //var ... some predefined properties that all enemies have but each enemy have it's own values 
} 

Enemies перечисление имеет неправильный синтаксис, но я искал способ, чтобы сделать такие вещи, как это. Какое лучшее решение для архивирования?

+0

Подсказка: вы можете определять функции внутри 'enum' – pNre

+0

@pNre Я знаю, но я не понимаю, как это могло мне помочь. –

ответ

1

Вы можете написать функцию, которая возвращает всех врагов на данном уровне, что-то вроде этого:

enum GameLevel : Int { 
    case Forest, Swamp, Castle 
} 

enum Enemies : Int { 

    case Stump 
    case Frog 
    case Zombie 
    case Witch 
    case Knight 
    case Archer 

    static func enemiesInLevel(level: GameLevel) -> [Enemies] { 
     switch level { 
     case .Forest: 
      return [Stump, Frog] 
     case .Castle: 
      return [Knight, Archer] 
     default: 
      return [] 
     } 
    } 

} 

// this is how you can call it 
let forestEnemies = Enemies.enemiesInLevel(.Forest) 
let castleEnemies = Enemies.enemiesInLevel(.Castle) 
1

Вы можете добавить метод экземпляра для GameLevel в список всех врагов, связанных с определенным элементом GameLevel ,

enum GameLevel : Int { 
    case Forest = 0, Swamp, Castle 
    func enemies() -> Array<Enemy> { 
     switch self { 
     case .Forest: return [.Stump, .Frog] 
     case .Swamp: return [.Zombie, .Witch] 
     case .Castle: return [.Knight, .Archer] 
    } 
} 

enum Enemy : Int { 
    case Stump = 0, Frog, Zombie, Witch, Knight, Archer 
} 

let forestLevel = GameLevel.Forest 
forestLevel.enemies() 

Наконец обратите внимание, что компания Apple предлагает использовать особые имена перечислений (например, «Враг» вместо «Враги»)

Каждое определение перечисление определяет новый тип. Как и другие типы Swift, их имена (например, CompassPoint и Planet) должны начинаться с заглавной буквы. Дайте типы перечисления сингулярных, а не множественное число имен, так что они читают, как сами собой разумеющиеся:

var directionToHead = CompassPoint.West” 

Выдержки От: Apple Inc. «The Swift язык программирования.» Интерактивные книги. https://itunes.apple.com/it/book/swift-programming-language/id881256329?l=en&mt=11

Смежные вопросы