2014-09-02 12 views
14

Tôi muốn mở rộng một lớp khung (Tôi không muốn chỉnh sửa mã nguồn trực tiếp) và làm cho nó phù hợp với NSCoding.Thêm NSCoding làm Phần mở rộng

Về cơ bản, đây là một việc đơn giản hóa về tình hình Tôi đang ở:?

/* Can't be edited. */ 
class Car: NSObject { 
    var color: String? 
} 

/* Can be edited */ 
extension Car: NSCoding { 
    init(coder aDecoder: NSCoder) { 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
    } 
} 

Vấn đề là init(coder aDecoder: NSCoder) là, theo các tập tin tiêu đề, một designated initializer (không này lạ mặc dù không nên nó là một convenience initializer?). Tuy nhiên, tiện ích mở rộng documentation cho biết không thể thêm trình khởi tạo được chỉ định mới.

Tiếng Anh của tôi không hoàn hảo và có thể tôi đã bỏ sót điều gì đó ... Hay thực sự là không thể?

Trả lời

10

Giống như tài liệu nói, tiện ích mở rộng không thể thêm bộ khởi tạo được chỉ định mới. Điều gì sẽ xảy ra nếu có các thuộc tính riêng cần khởi tạo? Nó sẽ không thể khởi tạo đúng kiểu. Bạn có thể thêm các trình khởi tạo thuận tiện trong một phần mở rộng vì bản chất của chúng, chúng phải gọi một trình khởi tạo được chỉ định.

Ngoài ra, init (coder aDecoder: NSCoder) được chỉ định làm trình khởi tạo được chỉ định vì nó là một tuyến đường hoàn toàn khác để tạo một cá thể. Lấy UIViewController ví dụ, nó có thể được tạo ra bằng cách sử dụng mã đơn giản hoặc nó có thể được tạo ra từ một tập tin XIB.

Cuối cùng, không thể thêm tiện ích triển khai NSCoding.

Có lẽ bạn có thể tạo lớp bao bọc chứa lớp này và yêu cầu lớp này triển khai NSCoding.

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