web-dev-qa-db-fra.com

Comment écrire la méthode Init dans Swift

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?

28
Vineesh TP

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
    }

}

mode avancé

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.

64
holex
class myClass {
    var text: String
    var response: String?

    init(text: String) {
        self.text = text
    }
}

Voir Swift: Initialisation (mieux vaut google la prochaine fois ..)

10
Shai

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)")

    }
6
abdul sathar

essayer:

initWithDictionary(dictionary : NSDictionary) {

   init()

   self.title = ... etc

}

Source :

1
CW0007007