あなたの主な目的は、いくつかのプロトコルに準拠したオブジェクトのコレクションを保持し、このコレクションに追加して削除することだと思います。これは、クライアント「SomeClass」で述べられている機能です。公平な継承には自己が必要であり、この機能には必要ありません。カスタムコンパレーターを使用できる「インデックス」関数を使用して、Obj-Cの配列でこれを機能させることもできましたが、これはSwiftではサポートされていません。したがって、最も簡単な解決策は、以下のコードに示すように、配列ではなく辞書を使用することです。必要なプロトコル配列を返すgetElements()を提供しました。そのため、SomeClassを使用しているユーザーは、実装に辞書が使用されていることさえ知りません。
いずれの場合でも、オブジェクトを区別するためにいくつかの区別できるプロパティが必要になるため、「名前」であると想定しました。新しいSomeProtocolインスタンスを作成するときは、do element.name = "foo"であることを確認してください。名前が設定されていない場合でもインスタンスを作成できますが、インスタンスはコレクションに追加されず、addElement()は「false」を返します。
protocol SomeProtocol {
var name:String? {get set} // Since elements need to distinguished,
//we will assume it is by name in this example.
func bla()
}
class SomeClass {
//var protocols = [SomeProtocol]() //find is not supported in 2.0, indexOf if
// There is an Obj-C function index, that find element using custom comparator such as the one below, not available in Swift
/*
static func compareProtocols(one:SomeProtocol, toTheOther:SomeProtocol)->Bool {
if (one.name == nil) {return false}
if(toTheOther.name == nil) {return false}
if(one.name == toTheOther.name!) {return true}
return false
}
*/
//The best choice here is to use dictionary
var protocols = [String:SomeProtocol]()
func addElement(element: SomeProtocol) -> Bool {
//self.protocols.append(element)
if let index = element.name {
protocols[index] = element
return true
}
return false
}
func removeElement(element: SomeProtocol) {
//if let index = find(self.protocols, element) { // find not suported in Swift 2.0
if let index = element.name {
protocols.removeValueForKey(index)
}
}
func getElements() -> [SomeProtocol] {
return Array(protocols.values)
}
}