Swift类与Objective-C类。我是在正确的轨道上吗?

时间:2015-01-11 07:44:44

标签: objective-c swift

我是Swift的新手。我已经参加了几个在线课程,并开始将现有的Objective-C项目转换为Swift作为学习体验。如果有人有时间,我有几个问题。我已经搜查了董事会,但没有找到答案。如果我错过了,我很抱歉。

  1. 委托协议 - 我曾经在Objective-C中定义自己的协议。下面我有原始的Objective-C版本,下面我有我的新Swift版本。我是否遵循了Swift的正确设计模式?

  2. 我发现自己为所有属性制作了选项,尤其是像NSData或自定义类这样的对象。这种做法可以接受吗?我不知道如何知道大多数对象的初始值。我知道语言要你设置一个初始值,但对某些对象来说似乎很奇怪。

  3. 如果我没弄错,我们不必在Swift中的自定义初始值设定项中调用self.super init。这是对的吗?

  4. Objective-C Version

    @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()
        }
    }
    

    谢谢,

    乔恩

1 个答案:

答案 0 :(得分:0)

  1. 您的协议定义有效。你应该知道一件小事:
  2.   

    与type属性要求一样,您始终使用type方法作为前缀   在a中定义class关键字的要求   协议

    protocol SomeProtocol {
            class func someTypeMethod()
        }
    
    1. 使用选项非常好,或者您可以使用像NSData这样的隐蔽解包选项。在这种情况下你应该这样做,如果没有,你可以在这里阅读:Why create "Implicitly Unwrapped Optionals"?
    2. 很快,您会在以下情况下执行此操作:

      a)使用initializtion无法定义常量,但是你知道它不会是nil(否则app会崩溃)

      b)Objective-C Api要求你使用指针,Obj-C中的指针可能是零。在这种情况下,你使用imilicity unwrapped optionals。

      1. 你总是要打电话给超级&#39;如果你有超类,可以肯定的是,该类已正确初始化。
      2. 希望有所帮助。