尝试使用self初始化结构会产生错误。正确的做法是什么?

时间:2018-09-30 22:00:07

标签: swift struct initialization init initializer

我有一个网络管理员结构。我正在尝试在主UIViewController中对其进行初始化,但是失败了。

struct NetworkManager {
    static var enviroment: NetworkEnviroment = .production
    static var apiKey = ""
    private let mainApiRouter = Router<MainApi>()

    func login(username: String, pass: String, completion:@escaping(_ product:User?, _ err: String?) ->()){
        mainApiRouter.request(.login(username: username, password: pass)) { (data, resp, err) in
            if err != nil {
                completion(nil, "Please check your network connection")
            } else {
                if let reponse = resp as? HTTPURLResponse {
                    let result = handelNetworkResponse(reponse)
                    switch result {
                    case .success:
                        guard let responseData = data else {
                            completion(nil, NetworkResponse.noData.rawValue)
                            return
                        }
                        do {
                            let apiResponse = try JSONDecoder().decode(UserData.self, from: responseData)
                            if apiResponse.data != nil {
                                completion(apiResponse.data, nil)
                            } else {
                                completion(nil, "User login failed")
                            }
                        }catch(let error) {
                            completion(nil, "\(error.localizedDescription)")
                        }
                    case .failure(let failureError):
                        completion(nil, failureError)
                    }
                }
            }
        }
    }
}

这就是我在视图控制器中对其进行初始化的方式,因此我可以在网络管理器结构中使用登录功能。当我呼叫super.init编码器时,网络管理员为零。

class LoginViewController: UIViewController {
    var networkManager: NetworkManager!

    init(networkManager: NetworkManager) {
        super.init(nibName: nil, bundle: nil)
        self.networkManager = networkManager
    }

    required init?(coder aDecoder: NSCoder) {
        // super.init(coder: aDecoder)
        fatalError("init(coder:) has not been implemented")
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是您试图从情节提要中加载此视图控制器,但尚未实现情节提要用于初始化在情节提要中创建的视图的init(coder:)。如果删除fatalError并使用super.init(coder: aDecoder),则视图控制器将成功加载,但是将不会调用用于初始化网络管理器的代码,因为情节提要在加载视图控制器时不会调用该初始化程序-您将不得不将该代码移到其他地方。