【问题标题】:Swift Classes vs. Objective-C Classes. Am I on the right track?Swift 类与 Objective-C 类。我在正确的轨道上吗?
【发布时间】:2015-03-09 05:14:26
【问题描述】:

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

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

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

  3. 如果我没记错的话,我们不必在 Swift 的自定义初始化程序中调用 self.super init。这是正确的吗?

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

斯威夫特版本

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

谢谢,

乔恩

【问题讨论】:

  • 通常 objC 中的协议继承自 协议。当有可选方法时,这一点尤其重要,因为您需要能够检查 协议中的 [delegate respondsToSelector:]。我不知道如何快速做到这一点,对不起,但我认为这是您原始 ObjC 代码的疏忽..

标签: objective-c swift


【解决方案1】:
  1. 您的协议定义有效。您应该了解一件小事:

与类型属性要求一样,您始终为类型方法添加前缀 使用 class 关键字定义的需求 协议

protocol SomeProtocol {
        class func someTypeMethod()
    }
  1. 使用可选项非常好,或者您可以使用隐式展开的可选项,例如 NSData!。在这种情况下你应该这样做,如果不这样做,你可以在这里阅读:Why create "Implicitly Unwrapped Optionals"?

简而言之,您在以下情况下会这样做:

a) 不能使用初始化来定义常量,但你知道它不会是 nil(否则应用会崩溃)

b) Objective-C Api 要求你使用指针,而 Obj-C 中的指针可以是 nil。在这种情况下,您可以使用未包装的可选选项。

  1. 如果您有超类,则必须始终调用“super”,以确保该类已正确初始化。

希望对您有所帮助。

【讨论】:

  • 感谢您的回答。我真的很感激时间。我将更多地研究隐式展开的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多