“Giao thức… chỉ có thể được sử dụng như một ràng buộc chung vì nó có các yêu cầu về kiểu riêng hoặc liên kết” nghĩa là gì?


123

Tôi đang cố gắng tạo một Từ điển (thực sự là một HashSet ) được khóa trên một giao thức tùy chỉnh trong Swift, nhưng nó khiến tôi gặp lỗi trong tiêu đề:

Giao thức 'myProtocol' chỉ có thể được sử dụng như một ràng buộc chung vì nó có các yêu cầu về kiểu riêng hoặc liên kết

và tôi không thể làm được đầu cũng như đuôi của nó.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes Đó không phải là một bản sao. Tôi đang hỏi thông báo lỗi thực sự có nghĩa là gì. "Yêu cầu loại tự hoặc liên kết" là gì?
defos1

Câu trả lời:


90

Giao thức Observingkế thừa từ giao thức Hashable, đến lượt nó kế thừa từ giao thức Equatable. Giao thức Equatablecó yêu cầu sau:

func ==(lhs: Self, rhs: Self) -> Bool

Và một giao thức có chứa Self ở đâu đó bên trong nó không thể được sử dụng ở bất kỳ đâu ngoại trừ trong một ràng buộc kiểu.

Đây là một câu hỏi tương tự.


7
... bởi vì trình biên dịch phải đảm bảo rằng nó cùng loại ở hai bên, nhưng giao thức chỉ đảm bảo nó đáp ứng hợp đồng. Tôi hiểu rồi. Tuy nhiên, có vẻ như Equatablekhông nhất thiết phải ngụ ý Equatablevì điều đó không hoàn toàn cần thiết để tạo mã băm.
defos1

4
Ồ, không cần phải chờ đợi, vì Dictionarycần phải biết một đối tượng nhất định có thực sự là khóa chính xác hay không, bởi vì hai đối tượng khác nhau có thể tạo ra cùng một mã băm. Hmm, đó là một chút khó khăn. Vì vậy, vấn đề ở đây thực sự là với Equatable.
defos1

4
Nhìn vào 00:56 vào bài thuyết trình tuyệt vời của Alexis Gallagher với tựa đề: Giao thức với Associated loại và làm thế nào họ nhận được theo cách đó (có thể) youtu.be/XWoNjiSPqI8
finneycanhelp

@finneycanhelp Cảm ơn vì điều này 👍👍. Video hay!
defos1

11

Để giải quyết vấn đề này, bạn có thể sử dụng generic. Hãy xem xét ví dụ này:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.