2014-06-09 17 views
7

Non riesco a trovare il modo corretto per conformare il protocollo NSSecureCoding a Swift, in particolare quando decodifica gli oggetti che sono una matrice di altri oggetti.Come implementare decodeObjectOfClasses in Swift

Non riesco a creare un NSSet tipi di classe in rapido.

In Objective-C userei

self.books = [aDecoder decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [Book class], nil] forKey:@"books"]; 

a Swift sto avendo problemi che creano il NSSet come questo:

self.books = aDecoder.decodeObjectOfClasses(NSSet().setByAddingObject(NSArray.self).setByAddingObject(Book.self), forKey:"books") 

Ecco l'errore:

Type 'NSArray.Type' does not conform to protocol 'AnyObject' 
+1

NSSet (oggetti: [NSArray.self, Book.self]) – cahn

+0

Cou Non trovo un overload per 'init' che accetta gli argomenti forniti. Provalo in un parco giochi classe Book { } classe di test {var set = nsset (oggetti: [NSArray.self, Book.self])} –

+0

possibile duplicato di [Come creare un array di classi in Swift] (http://stackoverflow.com/questions/24174510/how-to-create-a-class-array-in-swift) – user102008

risposta

0

Declaration

SWIFT

func decodeObjectOfClasses(_ classes: NSSet, 
        forKey key: String) -> AnyObject? 

Dal Swift 3.0:

func decodeObject<DecodedObjectType where DecodedObjectType : NSCoding, DecodedObjectType : NSObject>(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? 

Objective-C

- (id)decodeObjectOfClasses:(NSSet *)classes 
        forKey:(NSString *)key 

let books: AnyObject? = aDecoder.decodeObjectOfClasses(NSSet().setByAddingObject(NSArray.self).setByAddingObject(Book.self), forKey:"books") 
1

Per gli oggetti semplici:

0.123.
self.myObject = aDecoder.decodeObjectOfClass(MyObject.self, forKey: "myObject")! 

Dal Swift 3.0:

self.myObject = aDecoder.decodeObject(of:MyObject.self, forKey: "myObject")! 

Per gli oggetti nidificati:

NSSet(objects: [NSArray.self, Book.self]) 
0
Non

esattamente la stessa di quando ho originariamente pubblicato la domanda, ma ho raggiunto quello che volevo da utilizzando digitato collezioni come visto sotto

class Bookshelf: NSObject, NSSecureCoding { 
    var authors = [Author]() 
    var books = [Book]() 

    override init() { 
     super.init() 
    } 

    @objc func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(self.authors, forKey: "authors") 
     aCoder.encodeObject(self.books, forKey: "books") 
    } 

    @objc required init?(coder aDecoder: NSCoder) { 
     self.authors = (aDecoder.decodeObjectForKey("authors") as? [Author])! 
     self.books = (aDecoder.decodeObjectForKey("books") as? [Book])! 
    } 

    @objc static func supportsSecureCoding() -> Bool { 
     return true 
    } 
} 
+0

Questa funzione 'init (coder:)' non sta effettivamente utilizzando la codifica sicura. Per decodificare in sicurezza, è necessario conoscere la classe prima del tempo, quindi è necessario utilizzare 'decodeObject (of: forKey:)'. Maggiori dettagli su questo qui: http://nshipster.com/nssecurecoding/ – robotspacer

Problemi correlati