2014-06-09 23 views
7

Tôi đang gặp khó khăn khi tìm cách chính xác để phù hợp với các giao thức NSSecureCoding trong Swift, đặc biệt khi giải mã đối tượng mà là một mảng của các đối tượng khác.Làm thế nào để thực hiện decodeObjectOfClasses trong Swift

Tôi không thể tạo một số NSSet loại nhanh chóng.

Trong Objective-C Tôi sẽ sử dụng

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

trong Swift Tôi có vấn đề tạo NSSet như thế này:

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

Dưới đây là các lỗi:

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

NSSet (đối tượng: [NSArray.self, Book.self]) – cahn

+0

cou ld không tìm thấy quá tải cho 'init' chấp nhận các đối số được cung cấp. thử nó ra trong một sân chơi lớp Book { } class Test {var set = NSSet (đối tượng: [NSArray.self, Book.self]) } –

+0

trùng lặp có thể xảy ra [Làm thế nào để tạo ra một mảng lớp trong Swift] (http://stackoverflow.com/questions/24174510/how-to-create-a-class-array-in-swift) – user102008

Trả lời

0

Declaration

SWIFT

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

Từ 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

Đối với đối tượng đơn giản:

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

Từ Swift 3.0:

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

Đối với đối tượng lồng nhau:

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

Không chính xác giống như khi tôi lên đâu câu hỏi, nhưng tôi đã đạt được những gì tôi muốn bằng cách dùng gõ bộ sưu tập như bên dưới

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

Chức năng 'init (coder:)' này không thực sự sử dụng mã hóa an toàn. Để giải mã một cách an toàn, nó cần biết lớp trước - vì vậy bạn cần sử dụng 'decodeObject (of: forKey:)'. Thêm chi tiết về điều này ở đây: http://nshipster.com/nssecurecoding/ – robotspacer

Các vấn đề liên quan