2015-05-23 14 views
8

Do sự thiếu hiệp phương sai của Swift, tôi cần một số giải pháp thay thế. Tôi đến từ thế giới Java, vì vậy tôi theo bản năng đã cố gắng để tạo ra ràng buộc từ một loại đến loại chung khác.Tham số chung bị ràng buộc bởi tham số chung khác

Vì vậy, tôi đã viết lớp sau:

class Factory<T: AnyObject> { 
    let factoryClosure:() -> T 

    init(closure:() -> T) { 
     factoryClosure = closure 
    } 

    init<CHILD: T>(childFactory: Factory<CHILD>) { 
     factoryClosure = {() -> T in 
      return otherFactory.create() 
     } 
    } 

    func create() -> T { 
     return factoryClosure() 
    } 
} 

tôi mong đợi này để làm việc tốt. Tôi đã xác định được TCHILD phải là một lớp con của T. Trình biên dịch Swift tuy nhiên không đồng ý và hiển thị lỗi sau trên dòng với init<CHILD: T>.

thừa kế từ phi giao thức, loại phi lớp 'T'

Tôi đã thử các thừa kế tham số chung trong kịch bản khác nhau là tốt. Thêm phương thức sau vào lớp (và loại bỏ init đã gây ra lỗi biên dịch).

func to<OTHER where OTHER: AnyObject, T: OTHER>() { 

} 

Sản lượng này về cơ bản là cùng một đầu ra.

Loại 'T' hạn chế để loại phi giao thức 'KHÁC'

Bất cứ điều gì tôi có thể làm việc mặc dù không và kết thúc với thông báo lỗi tương tự. Đây có phải là một lỗi trong Swift? Hay tôi đang thiếu một cái gì đó? Hay đó là một tính năng của Swift và sẽ không bao giờ hoạt động như tôi nghĩ?

+0

Bạn đang thực sự cố gắng đạt được điều gì? Mục tiêu thực tế là, thay vì một số mã đang cố gắng đạt được mục tiêu không nói ra. –

+0

Mục đích tôi đang cố gắng đạt được là có một cái gì đó sẽ cho phép tôi giải quyết sự hiệp phương sai (nếu tôi nhớ lại thuật ngữ đó một cách chính xác). Trong Java, tôi sẽ sử dụng 'Factory 'và có thể truyền vào bất kỳ cá thể nào của' Factory' có tham số kiểu 'MyObject' hoặc các con của nó. –

+0

Điều đó vẫn giống như một phương tiện không phải là kết thúc. Mục tiêu thực sự là gì? –

Trả lời

0

Nếu bạn muốn vượt qua bất kỳ Factory<T> nơi T là loại AnyObject bạn chỉ phải viết:

init(childFactory: Factory<T>) { 
    factoryClosure = {() -> T in 
     return otherFactory.create() 
    } 
} 

vì T được tự động bị hạn chế bởi lớp học của bạn.

+0

Điều này sẽ không giải quyết được vấn đề, bởi vì bạn sẽ chỉ có thể vượt qua trong một 'Nhà máy 'và không phải 'Nhà máy ' ở đâu 'Z' là một phân lớp của' T'. –

+0

Tôi nghĩ rằng điều này giải quyết vấn đề của bạn bởi vì nếu 'Z' là một phân lớp của' T' nó cũng thuộc kiểu 'AnyObject'.Vì vậy, bạn cũng có thể vượt qua 'Nhà máy ' ('T' chỉ là một giữ chỗ cho một loại mà phù hợp cho' AnyObject') – Qbyte

+0

Trong bối cảnh, 'T' đã được hạn chế bởi các lớp học mà bạn đang tạo. Vì vậy, nếu bạn làm 'let zFactory = Factory () {return Z()}; hãy tFactory = Nhà máy (childFactory: zFactory) 'nó sẽ không hoạt động. –

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