“使用Alamofire和SwiftyJSON

时间:2017-05-28 22:00:15

标签: swift xcode swift3 alamofire swifty-json

我已经被这个应用程序开发问题困扰了很长一段时间,在查看了无数的指南,教程和示例之后,我决定最好的方法是自己构建我的代码,在适当的地方使用各种Alamofire / SwiftyJSON示例

我正在尝试创建一个应用程序,显示游戏服务器及其状态表(名称,在线玩家等)。我有一个基于PHP的API脚本,它能够检查这些信息并以JSON格式返回 - 一个没有子词典的单一嵌套字典。

为了读取这些数据,我创建了一个基于UITableViewController的Swift文件,其中包括调用此函数:

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请求中这一事实有关,但我不完全确定执行此类任务的最佳方式。

感谢您抽出时间阅读我的问题!

1 个答案:

答案 0 :(得分:0)

在调用super.init()并捕获Alamofire之前,您需要调用self ,否则无法知道任何继承状态是否已初始化。< / p>

在这种情况下就足够了,因为您的所有var都具有可选类型,并且已隐式初始化为nil。但是,如果您的var具有非可选类型,则它也需要初始化为某个值,例如类似的东西:

var myInt : Int = 0

HTH