【问题标题】:"Self captured by enclosure before all members were initialized" using Alamofire and SwiftyJSON使用 Alamofire 和 SwiftyJSON “在所有成员初始化之前被外壳自我捕获”
【发布时间】:2023-03-06 22:26:01
【问题描述】:

我已经被这个应用程序开发问题困扰了很长一段时间,在查看了无数指南、教程和示例之后,我决定最好的方法是自己构建我的代码,在适当的情况下使用各种 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"
}

我最终使用 Alamofire 和 SwiftyJSON 使用以下代码初始化 serverInfo

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

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

【问题讨论】:

    标签: swift xcode swift3 alamofire swifty-json


    【解决方案1】:

    您需要调用super.init() 你在那里调用Alamofire 并捕获self 否则任何继承的状态都不知道被初始化。

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

    var myInt : Int = 0
    

    HTH

    【讨论】:

    • 感谢您的回复! Xcode 似乎希望我包含“覆盖”关键字以及其他一些错误。 super.init() 应该为空吗?
    • 您必须调用超类定义的init 函数之一,您必须确定是哪一个。
    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多