2014-06-09 51 views
7

我无法找到符合协议的正确方法,尤其是在解码其他对象数组的对象时。如何在Swift中实现decodeObjectOfClasses

我无法在swift中创建类型的NSSet

在Objective-C,我会用

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

在斯威夫特我有问题创造了NSSet这样的:

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

这里的错误:

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

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

+0

Cou ld找不到接受提供的参数的'init'的重载。 尝试一下在操场 类Book { } 类测试{VAR 组=的NSSet(对象:[NSArray.self,Book.self]) }的 –

+0

可能重复[如何创建在Swift中的类数组](http://stackoverflow.com/questions/24174510/how-to-create-a-class-array-in-swift) – user102008

回答

0

Declaration

SWIFT

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

由于夫特3.0:

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

目的-C

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

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

对于简单的对象:

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

由于雨燕3.0:

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

对于嵌套对象:

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

不完全一样,当我最初发布这个问题,但我已经达到了我想用类型如下所示收藏

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

这个'init(coder:)'函数实际上并不使用安全编码。为了安全解码,它需要提前知道类 - 所以你需要使用'decodeObject(of:forKey :)'。有关此处的更多详细信息,请访问:http://nshipster.com/nssecurecoding/ – robotspacer

相关问题