Je veux écrire la méthode init
dans Swift
, ici j'ai donné la classe de modèle NSObject
dans Objective-C
-(id)initWithNewsDictionary:(NSDictionary *)dictionary
{
self = [super init];
if (self) {
self.title = dictionary[@"title"];
self.shortDescription = dictionary[@"description"];
self.newsDescription = dictionary[@"content:encoded"];
self.link = dictionary[@"link"];
self.pubDate = [self getDate:dictionary[@"pubDate"]];
}
return self;
}
Comment puis-je écrire cette méthode dans Swift
?
cela pourrait être de bonnes bases pour votre classe, je suppose:
class MyClass {
// you may need to set the proper types in accordance with your dictionarty's content
var title: String?
var shortDescription: String?
var newsDescription: String?
var link: NSURL?
var pubDate: NSDate?
//
init () {
// uncomment this line if your class has been inherited from any other class
//super.init()
}
//
convenience init(_ dictionary: Dictionary<String, AnyObject>) {
self.init()
title = dictionary["title"] as? NSString
shortDescription = dictionary["shortDescription"] as? NSString
newsDescription = dictionary["newsDescription"] as? NSString
link = dictionary["link"] as? NSURL
pubDate = self.getDate(dictionary["pubDate"])
}
//
func getDate(object: AnyObject?) -> NSDate? {
// parse the object as a date here and replace the next line for your wish...
return object as? NSDate
}
}
Je voudrais éviter de copier-coller-coller les clés dans un projet, donc je mettrais les clés possibles dans par exemple un enum
comme ceci:
enum MyKeys : Int {
case KeyTitle, KeyShortDescription, KeyNewsDescription, KeyLink, KeyPubDate
func toKey() -> String! {
switch self {
case .KeyLink:
return "title"
case .KeyNewsDescription:
return "newsDescription"
case .KeyPubDate:
return "pubDate"
case .KeyShortDescription:
return "shortDescription"
case .KeyTitle:
return "title"
default:
return ""
}
}
}
et vous pouvez améliorer votre méthode convenience init(...)
comme par exemple cela, et à l'avenir, vous pouvez éviter toute erreur de frappe possible des clés dans votre code:
convenience init(_ dictionary: Dictionary<String, AnyObject>) {
self.init()
title = dictionary[MyKeys.KeyTitle.toKey()] as? NSString
shortDescription = dictionary[MyKeys.KeyShortDescription.toKey()] as? NSString
newsDescription = dictionary[MyKeys.KeyNewsDescription.toKey()] as? NSString
link = dictionary[MyKeys.KeyLink.toKey()] as? NSURL
pubDate = self.getDate(dictionary[MyKeys.KeyPubDate.toKey()])
}
REMARQUE: c'est juste une idée brute de la façon dont vous pouvez le faire, il n'est pas nécessaire d'utiliser l'initialiseur conventionnel du tout, mais il semblait évident que je ne sais rien de votre classe finale - vous avez partagé une seule méthode.
class myClass {
var text: String
var response: String?
init(text: String) {
self.text = text
}
}
Voir Swift: Initialisation (mieux vaut google la prochaine fois ..)
Pas besoin d'appeler cette méthode à partir d'une autre classe, elle sera appelée automatiquement
override init()
{
super.init()
//synthesize.delegate = self
// println("my array elements are \(readingData)")
}