Swift - Защо init(coder) е необходим в AFHTTPSessionManager?

Нямам много опит в разработката на 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 се занимава с код, свързан с разкадровки (напр. извиква се, когато перото се зарежда).

Свързан въпрос Класът не прилага задължителните членове на своя суперклас съдържа малко информация, но това означава ли, че всички класове на Swift, които разширяват Objective-C, ще имат нужда от нея?


person Kosmetika    schedule 28.03.2015    source източник
comment
Сигурни ли сте, че този код връща единичен екземпляр, init трябва да е частен, ако трябва да получите екземпляр, който харесвате, var x = APIManager. sharedInstance, правилно ли е?   -  person Nata Mio    schedule 06.01.2016


Отговори (1)


initWithCoder: и encodeWithCoder: се използват всеки път, когато кодирате и декодирате обекти, обикновено за запис на/четене от диск. Прав сте, че разкадровките използват това, но това също е много често срещан начин за запазване на данни между стартиранията на приложения.

AFHTTPSessionManager прилага този метод, така че можете да кодирате вашия мениджър на сесии, ако желаете. Тъй като е имплементиран там, трябва да го замените във вашия подклас и да зададете или декодирате всички незадължителни свойства, преди да извикате super.

person Aaron Brager    schedule 28.03.2015