Самостоятельный захват корпуса до того, как все члены были инициализированы с помощью Alamofire и SwiftyJSON

Я был озадачен этим вопросом о разработке приложения уже довольно долгое время, и после просмотра бесчисленных руководств, руководств и примеров я решил, что лучшим путем было бы создать свой код самостоятельно, используя различные примеры Alamofire / SwiftyJSON, где это необходимо.

Я пытаюсь создать приложение, которое отображает таблицу игровых серверов и их статусы (имя, игроки в сети и т. Д.). У меня есть скрипт API на основе php, который может проверять эту информацию и возвращать ее в формате JSON - одноуровневый словарь без дополнительных словарей.

Чтобы прочитать эти данные, я создал файл Swift на основе UITableViewController, который среди прочего вызывает эту функцию:

private func loadServers() {
    let server1 = serverInfo(endpoint: "https://example.com/api/serverInfo.php?host=555.555.555.55&port=5555")
    servers += [server1]
}

В конечном итоге это добавит его в массив моих серверов, а в идеале - в таблицу. Однако моя проблема существует в инициализации файла serverInfo. Я настроил файл для хранения нужных мне данных, например:

//MARK: Properties

var name: String?
var map: String?
var game: String?
var game_desc: String?
var players: Int?
var maxPlayers: Int?

//MARK: Types

struct PropertyKey {
    static let name = "name"
    static let map = "map"
    static let game = "game"
    static let game_desc = "game desc"
    static let players = "players"
    static let maxPlayers = "maxPlayers"
}

В конечном итоге я инициализирую serverInfo следующим кодом, используя Alamofire и SwiftyJSON.

init(endpoint:String) {
    Alamofire.request(endpoint)
        .responseJSON { response in
            guard response.result.isSuccess else {
                // handle failure
                return
            }
            if let value = response.result.value {
                let info = JSON(value)
                self.name = info["name"].stringValue
                self.map = info["map"].stringValue
                self.game = info["game"].stringValue
                self.game_desc = info["description"].stringValue
                self.players = info["players"].int
                self.maxPlayers = info["maxplayers"].int
            }
    }
}

Однако я получаю сообщение об ошибке 'self' captured by a closure before all members were initialized. У меня есть ощущение, что это связано с тем фактом, что инициализация моих различных полей происходит в запросе API, который может завершиться ошибкой, но я не совсем уверен, как лучше всего выполнить такую ​​задачу.

Спасибо, что уделили время чтению моего выпуска!


person HunterM267    schedule 28.05.2017    source источник


Ответы (1)


Вам нужен вызов super.init() перед вызовом Alamofire и захватом self, иначе нельзя будет знать, что какое-либо унаследованное состояние инициализировано.

В этом случае этого достаточно, поскольку все ваши var имеют необязательный тип и неявно инициализируются как nil. Однако, если у вас есть var с необязательным типом, его тоже нужно будет инициализировать некоторым значением, например что-то вроде:

var myInt : Int = 0

HTH

person CRD    schedule 29.05.2017
comment
Спасибо за ваш ответ! Кажется, Xcode хочет, чтобы я включил ключевое слово override, а также некоторые другие ошибки. Должен ли super.init() быть пустым? - person HunterM267; 29.05.2017
comment
Вы должны вызвать одну из init функций, определенных вашим суперклассом, вы должны определить, какую из них. - person CRD; 29.05.2017