Swiftでは、次のように宣言することで、変数の型を明示的に設定できます。
var object: TYPE_NAME
さらに一歩踏み込んで、複数のプロトコルに準拠する変数を宣言する場合は、protocol
宣言型を使用できます。
var object: protocol<ProtocolOne,ProtocolTwo>//etc
1つ以上のプロトコルに準拠し、特定の基本クラス型でもあるオブジェクトを宣言したい場合はどうなりますか?Objective-Cの同等の機能は次のようになります。
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Swiftでは、私はそれが次のようになることを期待します:
var object: TYPE_NAME,ProtocolOne//etc
これにより、プロトコルで定義された追加のインターフェイスだけでなく、基本型の実装にも柔軟に対応できるようになります。
私が見逃しているもっと明白な方法はありますか?
例
例として、UITableViewCell
プロトコルに準拠したセルを返す責任があるファクトリーがあるとします。プロトコルに準拠したセルを返す汎用関数を簡単に設定できます。
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
後で、タイプとプロトコルの両方を活用しながら、これらのセルをデキューしたい
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
テーブルビューセルがプロトコルに準拠していないため、これはエラーを返します...
セルがaでUITableViewCell
ありMyProtocol
、変数宣言のに準拠していることを指定できますか?
正当化
ファクトリパターンに精通している場合、これは、特定のインターフェイスを実装する特定のクラスのオブジェクトを返すことができるという意味で理にかなっています。
私の例のように、特定のオブジェクトに適用したときに意味のあるインターフェースを定義したい場合があります。テーブルビューセルの私の例は、そのような理由の1つです。
提供された型は上記のインターフェースに厳密には準拠していませんが、ファクトリーが返すオブジェクトはそうなので、基本クラスの型と宣言されたプロトコルインターフェースの両方と対話する柔軟性を望んでいます
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
。このオブジェクトは、NSSomething
何に準拠しているかをすでに知っているので、まったく役に立たないようです。のプロトコルのいずれかに準拠していない場合、クラッシュ<>
がunrecognised selector ...
発生します。これはタイプセーフをまったく提供しません。