Giao thức xác định các yêu cầu (phương pháp, thuộc tính, ...) cho loại tuân thủ .
protocol FirstDelegate {
func someFunc()
}
protocol SecondDelegate {
func someFunc()
}
xác định hai giao thức với cùng phương thức được yêu cầu someFunc()
. Một loại thảo tuân thủ QTI phải thực hiện phương pháp này:
class SomeClass: FirstDelegate, SecondDelegate {
func someFunc() {
print("SomeClass implementation")
}
}
Một phần mở rộng giao thức cung cấp phương pháp và tài sản hiện thực với các loại thảo tuân thủ QTI. Một trường hợp đặc biệt của một phần mở rộng giao thức là một thực hiện mặc định, mà là những gì bạn đã định nghĩa ở đây:
extension FirstDelegate {
func someFunc() {
print("First delegate")
}
}
Nó định nghĩa một thực hiện mặc định của someFunc()
cho tất cả các loại phù hợp với FirstDelegate
.Vì đây là chỉ cần phương pháp của giao thức đó, một lớp Tuân thủ không cần phải xác định phương pháp tại tất cả:
class SomeClass: FirstDelegate {
}
SomeClass().someFunc() // Output: First delegate
Nhưng nếu lớp cung cấp thực hiện riêng của mình thì đó sẽ được sử dụng:
class SomeClass: FirstDelegate {
func someFunc() {
print("SomeClass implementation")
}
}
SomeClass().someFunc() // Output: SomeClass implementation
trong trường hợp của bạn, bạn đã xác định cài đặt mặc định của someFunc()
cho cả giao thức:
extension FirstDelegate {
func someFunc() {
print("First delegate")
}
}
extension SecondDelegate {
func someFunc() {
print("Second delegate")
}
}
Một lớp học vẫn có thể phù hợp với cả hai giao thức nếu nó cung cấp riêng thực hiện của phương pháp cần thiết:
class SomeClass: FirstDelegate, SecondDelegate {
func someFunc() {
print("SomeClass implementation")
}
}
Nhưng lớp không có thể phù hợp bằng cách sử dụng các cài đặt mặc định
class SomeClass: FirstDelegate, SecondDelegate {
}
cho cả hai giao thức vì có một xung đột . Nó không được chỉ định mà thực hiện mặc định nên được sử dụng, và đó là lý do tại sao trình biên dịch phàn nàn.
Hiện tại, lớp học hiện không phù hợp với không có của các giao thức. Điều này có thể được nhìn thấy trong nhật ký trình biên dịch đầy đủ trong báo cáo điều hướng:
main.swift:24:7: error: type 'SomeClass' does not conform to protocol 'FirstDelegate'
class SomeClass: FirstDelegate, SecondDelegate {
^
main.swift:5:10: note: multiple matching functions named 'someFunc()' with type '() ->()'
func someFunc()
^
main.swift:19:10: note: candidate exactly matches
func someFunc() {
^
main.swift:13:10: note: candidate exactly matches
func someFunc() {
^
main.swift:24:7: error: type 'SomeClass' does not conform to protocol 'SecondDelegate'
class SomeClass: FirstDelegate, SecondDelegate {
^
main.swift:9:10: note: multiple matching functions named 'someFunc()' with type '() ->()'
func someFunc()
^
main.swift:19:10: note: candidate exactly matches
func someFunc() {
^
main.swift:13:10: note: candidate exactly matches
func someFunc() {
^
Bạn đang cố gắng đạt được điều gì? Bạn sẽ gọi phương thức nào trong số cả hai phương thức này bằng 'SomeClass(). SomeFunc()'? –
Tôi đang phát với tiện ích mở rộng giao thức và cú pháp của chúng. Bằng cách đó, tôi đang cố hiểu các quy tắc và hành vi của họ. – mesmerizingr
@mesmerizingsnow Vâng nó không thực sự có ý nghĩa đối với hai giao thức để có cùng một phương pháp chính xác, sau đó bạn sẽ không cần hai giao thức bởi vì họ chỉ giống nhau ... – Kametrixom