Swift'de bir değişkenin türünü aşağıdaki gibi bildirerek açıkça belirleyebilirim:
var object: TYPE_NAME
Bunu bir adım daha ileri götürmek ve birden çok protokole uyan bir değişken bildirmek istiyorsak, protocol
bildirimi kullanabiliriz :
var object: protocol<ProtocolOne,ProtocolTwo>//etc
Bir veya daha fazla protokole uyan ve aynı zamanda belirli bir temel sınıf türünde olan bir nesneyi bildirmek istersem ne olur? Objective-C eşdeğeri şöyle görünür:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Swift'de şöyle görünmesini bekliyorum:
var object: TYPE_NAME,ProtocolOne//etc
Bu bize, protokolde tanımlanan ilave arayüzün yanı sıra temel tipin uygulanmasının üstesinden gelme esnekliği verir.
Kaçırabileceğim daha bariz başka bir yol var mı?
Misal
Örnek olarak, UITableViewCell
hücreleri bir protokole uygun olarak iade etmekten sorumlu bir fabrikam olduğunu varsayalım. Bir protokole uygun hücreleri döndüren genel bir işlevi kolayca kurabiliriz:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
Daha sonra, hem türü hem de protokolü kullanarak bu hücrelerin kuyruğunu açmak istiyorum
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Tablo görüntüleme hücresi protokole uymadığı için bu bir hata döndürür ...
Hücrenin a olduğunu UITableViewCell
ve MyProtocol
değişken bildirimindeki ile uyumlu olduğunu belirtmek isterim ?
Meşrulaştırma
Fabrika Örüntüsüne aşina iseniz, bu, belirli bir arabirimi uygulayan belirli bir sınıfın nesnelerini döndürebilme bağlamında mantıklı olacaktır.
Tıpkı benim örneğimde olduğu gibi, bazen belirli bir nesneye uygulandığında anlamlı olan arayüzler tanımlamayı seviyoruz. Tablo görünümü hücresi örneğim böyle bir gerekçedir.
Sağlanan tür, belirtilen arabirime tam olarak uymasa da, fabrikanın döndürdüğü nesne uyuyor ve bu nedenle hem temel sınıf türü hem de bildirilen protokol arabirimi ile etkileşimde esneklik istiyorum.