2015-07-23 20 views
14

Với hai giao thức và phần mở rộng của họ:Swift 2.0: phần mở rộng Giao thức: Hai giao thức với chữ ký chức năng tương tự biên dịch lỗi

protocol FirstDelegate { 
    func someFunc() 
} 

protocol SecondDelegate { 
    func someFunc() 
} 

extension FirstDelegate { 
    func someFunc() { 
     print("First delegate") 
    } 
} 

extension SecondDelegate { 
    func someFunc() { 
     print("Second delegate") 
    } 
} 

và cố gắng để phù hợp với cả hai trong số họ:

class SomeClass: FirstDelegate, SecondDelegate {} 

tôi nhận được lỗi biên dịch thời gian:

Type 'SomeClass' does not conform to protocol 'FirstDelegate'

Trao đổi FirstDelegateSecondDelegate:

class SomeClass: SecondDelegate, FirstDelegate {} 

sản xuất ngược:

Type 'SomeClass' does not conform to protocol 'SecondDelegate'

Loại bỏ một trong những phần mở rộng giải quyết vấn đề. Ditto cung cấp triển khai cho someFunc() bên trong SomeClass.

Chức năng mở rộng giao thức này khá mới đối với tôi. Ngoài ra thông tin về nó trong một chính thức của Apple 'Hướng dẫn lập trình Swift (Prerelease)' là khan hiếm vào lúc này.

Tôi có vi phạm một số quy tắc của tiện ích giao thức tại đây không?

+2

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()'? –

+0

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

+0

@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

Trả lời

29

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() { 
     ^
+5

Có thể (nếu bạn muốn) để tái sử dụng một trong những triển khai mặc định một cách rõ ràng, sau đó bên trong buộc phải thực hiện chức năng lớp, mà không cần phải (mặc dù không nhất thiết) mã trùng lặp xin vui lòng? – Ali

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