2015-05-04 2 views
0

Я работаю над проектом Swift с пользовательскими классами. Старая версия Objective-C проекта имела пользовательский метод инициализации, показанный ниже.Objective -C vs. Swift Пользовательские инициализаторы

Пользовательских инициализации из пользовательского класса

-(id) initWithURLDictionary: (NSDictionary *) dictionary{ 
self = [super init]; 
if (self) { 
    self.URLDictionary = dictionary; 
} 
return self; 

}

При использовании этого класса я хотел бы создать объект с пользовательским инициализатором, а затем установить делегат для пользовательского класса к себе.

// Create a temporary dictionary of the feeds, allocate and initialize the FLODataHandler object and set the delegate (me) to self. 
NSDictionary *URLTempDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: kFLOCyclingURL, @"FLO Cycling", kTriathleteURL, @"Triathlete", kVeloNewsURL, @"Velo News", kCyclingNewsURL, @"Cycling News", kRoadBikeActionURL, @"Road Bike Action", kIronmanURL, @"Ironman", nil]; 
self.dataHandler = [[FLODataHandler alloc] initWithURLDictionary: URLTempDictionary]; 
self.dataHandler.delegate = self; 

В Swift я немного смущен. Кажется, у меня есть два варианта. Вариант 1 заставил бы меня создать пользовательский инициализатор в пользовательском классе.

Пользовательские Initializer в пользовательском классе

init(dictionary : [String:String]) { self.URLDictionary = dictionary } 

Процесс такой же, как и в Objective-C.

let URLTempDictionary = [kFLOCyclingURL : "FLO Cycling", kTriathleteURL : "Triathlete", kVeloNewsURL : "Velo News", kCyclingNewsURL : "Cycling News", kRoadBikeActionURL : "Road Bike Action", kIronmanURL : "Ironman"] 

    var tempDataHandler = FLODataHandler(dictionary: URLTempDictionary) 
    self.dataHandler! = tempDataHandler 

Вариант 2 не является жалобой, но представляется неполным.

Вместо создания пользовательского инициализатора я бы просто сделал следующее. Пользовательский класс имеет свойство словаря URLDictionary.

let URLTempDictionary = [kFLOCyclingURL : "FLO Cycling", kTriathleteURL : "Triathlete", kVeloNewsURL : "Velo News", kCyclingNewsURL : "Cycling News", kRoadBikeActionURL : "Road Bike Action", kIronmanURL : "Ironman"] 

self.dataHandler!.URLDictionary = URLTempDictionary 
self.dataHandler.delegate = self 

Так что мой вопрос связан с необходимостью пользовательского инициализаторе и использование

var tempDataHandler = FLODataHandler(dictionary: URLTempDictionary) 

использование

self.dataHandler!.URLDictionary = URLTempDictionary 

выполнить ли тот же результат?

Позаботьтесь,

Jon

+0

Не могли бы вы сообщить мне, как вы объявили данные членомHandler в своем классе? – Abdullah

ответ

1

Целью инициализатора является эффективно вынуждаются вызывающего абонента поставлять данные - и Swift помогает вам исполнение этого контракта таким образом, что Objective-C делает не. Если вы объявите init(dictionary:), все остальные унаследованные инициализаторы перестанут наследоваться, а init(dictionary:) станет только способом сделать FLODataHandler.

Так что если важно, чтобы FLODataHandler имел значение URLDictionary из get-go, непременно объявите инициализатор. Действительно, если важно, чтобы у него также был делегат, вместо этого объявите init(dictionary:delegate:). Это «лучшая практика».

С другой стороны, нет ничего естественного в отношении двухступенчатой ​​инициализации, т. Е. Сначала создать объект, а затем дать его значения свойств; и есть ситуации в реальном программировании iOS, где нет реальной альтернативы (prepareForSegue приходит на ум). Проблема заключается в том, что он полагается на невыполнимый контракт, который вызывающий должен просто узнать каким-то другим способом и добровольно присоединиться к нему.

EDIT: Вы также, кажется, просят ли просто говоря

self.dataHandler!.URLDictionary = URLTempDictionary 

каким-то волшебным образом создает FLODataHandler занять dataHandler собственность. Это, безусловно, нет. Никакие объекты не появляются волшебным образом в Свифт, не более, чем в Objective-C. Если никто не сказал FLODataHandler(...), то такой экземпляр не существует. Если никому не присваивался экземпляр FLODataHandler до self.dataHandler, тогда там нет FLODataHandler (и приведенный выше код сработает, если это означает, что вы пытаетесь развернуть nil).

+0

Благодарим вас за ответ. Это имеет большой смысл. Один последующий вопрос. В Objective-C мы должны специально вызвать alloc и init, а затем передать объект в свойство. Не так ли в Свифте? Строка self.dataHandler! .URLDictionary = URLTempDictionary охватывает создание нового объекта? – jonthornham

+0

Нет, это не так. Но мне кажется, что это совсем другое дело. Мы говорим о том, как обработчик данных приобретает словарь, а не как создать экземпляр в первую очередь. – matt

+0

Я добавлю это к моему сведению. – matt

Смежные вопросы