Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?

Posted

技术标签:

【中文标题】Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?【英文标题】:Swift - Why init(coder) is required in AFHTTPSessionManager?Swift - 为什么在 AFHTTPSessionManager 中需要 init(coder)? 【发布时间】:2015-03-28 17:12:42 【问题描述】:

我在 ios 开发方面不是很有经验。在制作AFHTTPSessionManager 的子类时,XCode 建议我包含必需的init(coder)

import UIKit

let _sharedAPIManager = APIManager(baseURL: NSURL(string: API_URL)!)

class APIManager: AFHTTPSessionManager 

    /**
     * Singleton service 
     * (https://github.com/hpique/SwiftSingleton)
     */
    class var sharedInstance : APIManager 
        return _sharedAPIManager
    

    init(baseURL url: NSURL!) 
        super.init(baseURL: url, sessionConfiguration: nil)

        self.responseSerializer = AFJSONResponseSerializer() as AFJSONResponseSerializer
        self.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer

        self.requestSerializer.setValue(API_KEY, forHTTPHeaderField: "X-Api-Key")
        self.requestSerializer.setValue("3", forHTTPHeaderField: "X-Api-Version")
    

    // this was inserted by XCode
    required init(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我的主要问题是为什么需要它?据我所知NSCoder 处理与故事板相关的代码(例如,在 nib 加载时调用)。

相关问题 Class does not implement its superclass's required members 包含一些信息,但这是否意味着所有扩展 Objective-C 的 Swift 类都需要它?

【问题讨论】:

你确定这段代码返回一个单例实例吗,init 应该是私有的,如果你需要得到你喜欢的实例,var x = APIManager. sharedInstance ,对吗? 【参考方案1】:

initWithCoder:encodeWithCoder: 用于任何时候对对象进行编码和解码,通常用于写入/读取磁盘。故事板使用它是对的,但它也是在应用程序启动之间保存数据的一种非常常见的方式。

AFHTTPSessionManager 实现了此方法,以便您可以根据需要对会话管理器进行编码。因为它是在那里实现的,所以您必须在子类中覆盖它,并在调用 super 之前设置或解码任何非可选属性。

【讨论】:

以上是关于Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?的主要内容,如果未能解决你的问题,请参考以下文章

在构建带有关联 Swift 库的 Swift 命令行工具时,为啥要嵌入框架?

Swift - 为啥我在选择时无法更改色调?

为啥 CFStringEncodings 在 Swift 中没有 UTF8?

为啥某些 Swift 标准库函数在 Playground 中无法识别?

为啥我的图像无法在 Swift 中正确加载

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?