【发布时间】:2015-03-09 05:14:26
【问题描述】:
我是 Swift 的新手。我参加了几门在线课程,并开始将现有的 Objective-C 项目转换为 Swift 作为学习体验。如果有人有时间,我有几个问题。我已经搜索了董事会,但没有找到答案。如果我错过了,我很抱歉。
委托协议 - 我习惯于在 Objective-C 中定义自己的协议。下面是原始的 Objective-C 版本,下面是我的新 Swift 版本。我是否遵循了正确的 Swift 设计模式?
我发现自己为所有属性特别是像 NSData 或自定义类这样的对象制作了可选项。这种做法是否可以接受?我不确定如何知道大多数对象的初始值。我知道该语言希望您设置一个初始值,但对于某些对象来说这似乎很奇怪。
如果我没记错的话,我们不必在 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