2015-03-28 3 views
2

Я не очень опытен в разработке iOS. Несмотря на то, что делает подкласс AFHTTPSessionManager XCode предложил мне включать требуется init(coder):Swift - Почему в AFHTTPSManManager требуется 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 касается кода, связанного с раскадрой (например, когда он загружается).

Связанный с этим вопрос Class does not implement its superclass's required members содержит некоторую информацию, но означает ли это, что все классы Swift, которые расширяют объекты Objective-C, нуждаются в этом?

+0

Вы уверены, что этот код возвращает экземпляр singleton, init должен быть закрытым, если вам нужно получить экземпляр, который вам нравится, var x = APIManager. sharedInstance, это правильно? –

ответ

1

initWithCoder: и encodeWithCoder: используются при каждом кодировании и декодировании объектов, как правило, для записи/чтения с диска. Вы правы, что раскадровки используют это, но это также очень распространенный способ сохранить данные между запусками приложений.

AFHTTPSessionManager реализует этот метод, чтобы вы могли кодировать ваш менеджер сеансов, если хотите. Поскольку он реализован там, вы должны переопределить его в своем подклассе и установить или декодировать любые необязательные свойства, прежде чем вы вызовете супер.