swift plist декодер глобальный спрайткит - PullRequest
0 голосов
/ 20 октября 2018

Мне нужен словарь из моего списка, который я могу использовать во всей игровой сцене.Однако в моем решении мне всегда нужно вызывать функцию parseConfig, чтобы получить словарь из списка.

struct Config: Decodable {
    private enum CodingKeys: String, CodingKey {
        case zPositions, enemy, player
    }

    let zPositions: [String:Double]
    let enemy: [String:[String:Double]]
    let player: [String:[String:Double]]
}

func parseConfig() -> Config {
    let url = Bundle.main.url(forResource: "Config", withExtension: "plist")!
    let data = try! Data(contentsOf: url)
    let decoder = PropertyListDecoder()
    return try! decoder.decode(Config.self, from: data)
}

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

try crate lazy свойство.

Что-то вроде: - если использовать gloabaly

var parsedConfig: Config  = {
    let url = Bundle.main.url(forResource: "Config", withExtension: "plist")!
    let data = try! Data(contentsOf: url)
    let decoder = PropertyListDecoder()
    return try! decoder.decode(Config.self, from: data)
}()

если в классе добавить lazy перед var

0 голосов
/ 20 октября 2018

Вы можете попытаться написать закрытие для загрузки только один раз

lazy var myConfig : Config  = {  
      let url = Bundle.main.url(forResource: "Config", withExtension: "plist")!
      let data = try! Data(contentsOf: url)
      let decoder = PropertyListDecoder()
      return try! decoder.decode(Config.self, from: data)
}()

или внутри синглтона во всех приложениях

class Service {

 static let shared = Service()

  lazy var myConfig : Config  = { 

      let url = Bundle.main.url(forResource: "Config", withExtension: "plist")!
      let data = try! Data(contentsOf: url)
      let decoder = PropertyListDecoder()
      return try! decoder.decode(Config.self, from: data)
  }()

}
...