2015-02-23 28 views
11

Tôi muốn thực hiện một cái gì đó như "registerClassForAction". Vì mục đích đó, tôi đã xác định một giao thức:Swift: Lớp khởi tạo (AnyClass) phù hợp với giao thức

@objc protocol TestProt { 
    func testMe() -> String 
} 

Hãy làm một khai báo lớp:

class TestClass: NSObject, TestProt { 
    func testMe() -> String { 
     return "test" 
    } 
} 

tôi xác định các chức năng để đăng ký các đối tượng trong lớp khác:

func registerClassForAction(aClass: AnyClass) { ... } 

Chuyển sang REPL, tôi sẽ mô phỏng phương thức đăng ký:

let aClass: AnyClass = TestClass.classForCoder() //or .self 
let tClass = aClass as NSObject.Type 
let tInst = tClass() as TestProt 
tInst.testMe() 

này hiện đang hoạt động nhưng có một cách khác để nhanh chóng tClass, khác hơn so với

let tClass = aClass as NSObject.Type 

Lý do đề nghị, tôi muốn khám phá những cơ hội nhận được thoát khỏi NSObject nên TestClass của tôi không đến kế thừa từ NSObject. Đoàn đã được xem xét, nhưng tôi muốn kiểm soát tuổi thọ của tInst và có thể giải quyết nó tại một thời điểm cụ thể.

nhờ giúp

Ron

+1

Các "xác định một chức năng để đăng ký các đối tượng trong một lớp khác "là phái đoàn. Tôi sẽ đề nghị rằng đối tượng gọi của bạn tạo ra một thuộc tính ủy nhiệm TestProt và bạn gán TestClass cho nó. Loại thể dục dụng cụ đúc là khó hiểu nhất. –

+0

Bạn nói đúng - tôi đã được 'truyền cảm hứng' bằng phương thức 'registerClass: forCellWithReuseIdentifier:' của UITableViewController. Nhưng tôi cũng muốn kiểm soát vòng đời của lớp học, vì nó chỉ cần vào một thời điểm rất cụ thể và sau đó có thể bỏ đi. Không chắc chắn nếu đoàn là sự lựa chọn đúng đắn. Chỉ cần ra khỏi tò mò, tôi đang học về sự phù hợp của Instantiation và Protocol vì vậy đây có vẻ là một bài tập tốt. – Ron

Trả lời

2

Điều này có thể ở Swift 2.0 mà không đòi hỏi @objc hoặc subclassing NSObject:

protocol TestProt { 
    func testMe() -> String 
} 

class TestClass: TestProt { 

    // This init is required in order 
    // to construct an instance with 
    // a metatype value (class.init()) 
    required init() { 
    } 

    func testMe() -> String { 
     return "Hello from TestClass" 
    } 
} 

let theClass = TestClass.self 
let tInst: TestProt = theClass.init() 

tInst.testMe() 

enter image description here

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