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 T
và CHILD
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ĩ?
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. –
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 mở rộng MyObject> '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ó. –
Đ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ì? –