2015-01-11 3 views
2

Я новичок в Swift. Я взял пару онлайн-курсов и начал преобразовывать существующий проект Objective-C в Swift как учебный опыт. У меня есть несколько вопросов, если у кого-то есть время. Я искал доску, но не нашел ответов. Прошу прощения, если я пропустил их.Быстрые классы против классов Objective-C. Я на правильном пути?

  1. Протоколы делегатов - Я привык определять свои собственные в Objective-C. Ниже у меня есть исходная версия Objective-C, а ниже у меня есть новая версия Swift. Я следил за правильным шаблоном проектирования для Swift?

  2. Я нахожу, что делаю дополнительные опции для всех объектов, таких как NSData или пользовательские классы. Является ли эта практика приемлемой? Я не уверен, как узнать начальное значение для большинства объектов. Я знаю, что язык хочет, чтобы вы установили начальное значение, но для некоторых объектов это кажется странным.

  3. Если я не ошибаюсь, нам не нужно называть self.super init в пользовательских инициализаторах в Swift. Это верно?

Objective-C Версия

@protocol FLOParserHandlerDelegate; 

@interface FLOParserHandler: NSObject <NSXMLParserDelegate> 

// Properties 
@property (nonatomic, strong) NSMutableData *PHData; 
@property (nonatomic, strong) NSMutableString *currentParsedCharacterData; // This grabs the  characters as they come in and adds them together. 
@property (nonatomic, strong) NSMutableArray *XMLDataArray; // This is the master array that holds all of the article arrays with the date, title and link objects. 
@property (nonatomic, strong) NSMutableDictionary *dateTitleLinkDictionary;// This is used to gather the date, title and link in an array to added to the master array. 

// Delegate Property 
@property (nonatomic, weak) id <FLOParserHandlerDelegate> delegate; 

// init Methods 
- (id) initWithCHData: (NSMutableData *) data; 

// Class Methods 
-(void) startParser; 

@end 

#pragma mark- 
#pragma mark FLOParserHandler Protocol Definition 

@protocol FLOParserHandlerDelegate 
@optional 

- (void) floParserHandlerDidFinishParsing: (FLOParserHandler *) parserHandler; 
- (void) floParserHandler: (FLOParserHandler *) parserHandler didFailWithError: (NSError *) error; 

@end 

Swift Версия

import Foundation 

protocol FLOParserHandlerDelegate 
{ 
    func floParserHandlerDidFinishParsing(parserHandler : FLOParserHandler) ->() 
    func floParserHandler(parserHandler : FLOParserHandler, error : NSError) ->() 
} 

// Note that we have to inherit from NSObject here. I believe this iis because we are mixing it with Objective-C. 
class FLOParserHandler : NSObject, NSXMLParserDelegate 
{ 
    var PHData : NSData? 
    var currentParsedCharacterData : String? 
    var XMLDataArray : [String]? 
    var dateDictionary : [String:NSDate]? 
    var titleDictionary : [String:String]? 
    var linkDictionary : [String:String]? 

    // Delegate Property 
    var delegate : FLOParserHandlerDelegate? 

    // Init Methods 
    init(data : NSData) 
    { 
     self.PHData = data 
    } 

    // Class Methds 
    func startParser() 
    { 
     var parser = NSXMLParser(data: self.PHData) 
     parser.delegate = self 
     parser.parse() 
    } 
} 

Спасибо,

Jon

+0

Обычно протокол в objC наследуется от протокола .Это особенно важно, когда есть дополнительные методы, потому что вы должны иметь возможность проверять [delegate replysToSelector:], который находится в протоколе . Я не знаю, как это сделать быстро, извините, но я думаю, что это недосмотр в вашем исходном коде ObjC. – Jef

ответ

0
  1. Ваш пр Определение otocol действительно. Существует одна маленькая вещь, которую вы должны знать о:

Как имущественных требований типа, вы всегда Приставка метод типа требования с классом ключевого слова, когда они определены в протоколе

protocol SomeProtocol { 
     class func someTypeMethod() 
    } 
  1. Его отлично подходят для использования опционально, или вы можете использовать развязанные варианты, такие как NSData !. В этом случае вы должны это сделать, а где нет, вы можете прочитать здесь: Why create "Implicitly Unwrapped Optionals"?.

Вскоре, вы делаете это в следующих ситуациях:

а) Константа не может быть определена с помощью initializtion, но вы знаете, что она не будет ноль (в противном случае приложение будет врезаться)

б) Цель -C Api потребовал, чтобы вы использовали указатели, а указатели в Obj-C могли быть нулевыми. В этом случае вы используете модификаторы, которые не используются.

  1. Вы всегда должны называть «супер», если у вас есть суперкласс, чтобы убедиться, что этот класс правильно инициализирован.

Надеюсь, что это поможет.

+0

Благодарим вас за ответ. Я очень ценю время. Я буду больше смотреть в Неявно развернутые варианты. – jonthornham

+0

Рад, что я могу помочь! –

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