Nếu ràng buộc loại Swift chung là tên giao thức, tôi có thể yêu cầu hai loại, bị ràng buộc với giao thức đó, phải là cùng loại. Ví dụ:cách nói "cùng một lớp" trong Swift generic
protocol Flier {}
struct Bird : Flier {}
struct Insect: Flier {}
func flockTwoTogether<T:Flier>(f1:T, f2:T) {}
Chức năng flockTwoTogether
có thể được gọi với một chim và chim hoặc với một côn trùng và côn trùng, nhưng không phải với một Bird và côn trùng. Đó là giới hạn mà tôi muốn. Càng xa càng tốt.
Tuy nhiên, nếu tôi cố gắng điều tương tự với một tên lớp, nó không hoạt động:
class Dog {}
class NoisyDog : Dog {}
class WellBehavedDog: Dog {}
func walkTwoTogether<T:Dog>(d1:T, d2:T) {}
Vấn đề là tôi có thể gọi walkTwoTogether
với một WellBehavedDog và NoisyDog. Đây là những gì tôi muốn ngăn chặn.
Có thực sự hai câu hỏi ở đây:
Có cách nào để nói rằng
walkTwoTogether
không thể được gọi với một WellBehavedDog và NoisyDog?Đây có phải là lỗi không? Tôi hỏi vì nếu tôi không thể sử dụng chung để nói điều này, thật khó để hiểu tại sao nó hữu ích cho một ràng buộc chung là một tên lớp ở tất cả, vì chúng ta có thể nhận được kết quả tương tự chỉ với một hàm bình thường.
Điều này có vẻ như hành vi mong đợi đối với tôi? Bạn đã hạn chế tùy chọn là loại Dog. cả hai lớp con của bạn đều phù hợp với loại đó và không có gì trong khai báo ràng buộc chúng. Nếu có một cách để làm những gì bạn muốn tôi mong đợi nó sẽ yêu cầu mệnh đề 'where', như trong' ', nhưng điều đó cũng ném lỗi. –
cmyr
@cmyr Vâng, tất nhiên tôi đã thử điều đó. Đó là lý do tại sao tôi hỏi nếu những gì tôi đang làm là không làm thế nào để làm điều đó, là nó có thể làm điều đó. :) – matt
Tất cả đều hoạt động nếu 'Dog' là giao thức.Các ràng buộc chung không thể được thực thi trên các loại không giao thức. * (cái gì đó loại Erasure) * – mattt