我是Swift的新手。我已经参加了几个在线课程,并开始将现有的Objective-C项目转换为Swift作为学习体验。如果有人有时间,我有几个问题。我已经搜查了董事会,但没有找到答案。如果我错过了,我很抱歉。
委托协议 - 我曾经在Objective-C中定义自己的协议。下面我有原始的Objective-C版本,下面我有我的新Swift版本。我是否遵循了Swift的正确设计模式?
我发现自己为所有属性制作了选项,尤其是像NSData或自定义类这样的对象。这种做法可以接受吗?我不知道如何知道大多数对象的初始值。我知道语言要你设置一个初始值,但对某些对象来说似乎很奇怪。
如果我没弄错,我们不必在Swift中的自定义初始值设定项中调用self.super init。这是对的吗?
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()
}
}
谢谢,
乔恩
答案 0 :(得分:0)
与type属性要求一样,您始终使用type方法作为前缀 在a中定义class关键字的要求 协议
protocol SomeProtocol {
class func someTypeMethod()
}
很快,您会在以下情况下执行此操作:
a)使用initializtion无法定义常量,但是你知道它不会是nil(否则app会崩溃)
b)Objective-C Api要求你使用指针,Obj-C中的指针可能是零。在这种情况下,你使用imilicity unwrapped optionals。
希望有所帮助。