Trong Swift, tôi có thể đặt kiểu của một biến một cách rõ ràng bằng cách khai báo nó như sau:
var object: TYPE_NAME
Nếu chúng ta muốn tiến thêm một bước và khai báo một biến phù hợp với nhiều giao thức, chúng ta có thể sử dụng protocol
khai báo:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
Điều gì sẽ xảy ra nếu tôi muốn khai báo một đối tượng tuân theo một hoặc nhiều giao thức và cũng thuộc loại lớp cơ sở cụ thể? Tương đương Objective-C sẽ như thế này:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Trong Swift, tôi mong đợi nó trông như thế này:
var object: TYPE_NAME,ProtocolOne//etc
Điều này mang lại cho chúng ta sự linh hoạt khi có thể đối phó với việc triển khai kiểu cơ sở cũng như giao diện bổ sung được xác định trong giao thức.
Có cách nào khác rõ ràng hơn mà tôi có thể thiếu không?
Thí dụ
Ví dụ: giả sử tôi có một UITableViewCell
nhà máy chịu trách nhiệm trả về các ô tuân theo một giao thức. Chúng ta có thể dễ dàng thiết lập một hàm chung trả về các ô tuân theo một giao thức:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
sau đó, tôi muốn hủy hàng hóa các ô này trong khi tận dụng cả loại và giao thức
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Điều này trả về lỗi vì ô xem bảng không tuân theo giao thức ...
Tôi muốn có thể chỉ định ô đó là a UITableViewCell
và phù hợp với MyProtocol
khai báo biến?
Biện minh
Nếu bạn đã quen với Factory Pattern, điều này sẽ có ý nghĩa trong bối cảnh có thể trả về các đối tượng của một lớp cụ thể triển khai một giao diện nhất định.
Cũng giống như trong ví dụ của tôi, đôi khi chúng ta muốn xác định các giao diện có ý nghĩa khi áp dụng cho một đối tượng cụ thể. Ví dụ của tôi về ô xem bảng là một trong những lý do như vậy.
Trong khi kiểu được cung cấp không hoàn toàn phù hợp với giao diện đã đề cập, đối tượng mà nhà máy trả về sẽ có và vì vậy tôi muốn sự linh hoạt trong việc tương tác với cả kiểu lớp cơ sở và giao diện giao thức đã khai báo
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
. Đối tượng này có vẻ khá vô dụng vì NSSomething
đã biết nó tuân theo những gì. Nếu nó không phù hợp với một trong các giao thức trong <>
bạn sẽ gặp unrecognised selector ...
sự cố. Điều này không cung cấp an toàn cho loại nào cả.