Di Swift saya dapat secara eksplisit mengatur tipe variabel dengan mendeklarasikannya sebagai berikut:
var object: TYPE_NAME
Jika kita ingin melangkah lebih jauh dan mendeklarasikan variabel yang sesuai dengan beberapa protokol, kita dapat menggunakan protocol
deklaratif:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
Bagaimana jika saya ingin mendeklarasikan objek yang sesuai dengan satu atau lebih protokol dan juga dari tipe kelas dasar tertentu? Persamaan Objective-C akan terlihat seperti ini:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Di Swift saya berharap akan terlihat seperti ini:
var object: TYPE_NAME,ProtocolOne//etc
Ini memberi kami fleksibilitas untuk dapat menangani implementasi tipe dasar serta antarmuka tambahan yang ditentukan dalam protokol.
Apakah ada cara lain yang lebih jelas yang mungkin saya lewatkan?
Contoh
Sebagai contoh, katakanlah saya memiliki UITableViewCell
pabrik yang bertanggung jawab untuk mengembalikan sel yang sesuai dengan protokol. Kita dapat dengan mudah mengatur fungsi generik yang mengembalikan sel yang sesuai dengan protokol:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
nanti saya ingin menghapus sel-sel ini sambil memanfaatkan jenis dan protokolnya
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Ini mengembalikan kesalahan karena sel tampilan tabel tidak sesuai dengan protokol ...
Saya ingin dapat menentukan bahwa sel adalah a UITableViewCell
dan sesuai dengan MyProtocol
deklarasi variabel?
Pembenaran
Jika Anda sudah familiar dengan Factory Pattern, ini akan masuk akal dalam konteks untuk mengembalikan objek dari kelas tertentu yang mengimplementasikan antarmuka tertentu.
Sama seperti dalam contoh saya, terkadang kami ingin mendefinisikan antarmuka yang masuk akal saat diterapkan ke objek tertentu. Contoh saya dari sel tampilan tabel adalah salah satu justifikasi tersebut.
Sementara tipe yang disediakan tidak sepenuhnya sesuai dengan antarmuka yang disebutkan, objek yang dikembalikan pabrik melakukannya dan saya ingin fleksibilitas dalam berinteraksi dengan tipe kelas dasar dan antarmuka protokol yang dinyatakan