2017-09-05 9 views
0

私はSwiftの中で、挿入順序を維持し、コンパニオンプロトコルで定義されているisEqualメソッドを使用して、オブジェクトがすでにセット内にあるかどうかを判断するジェネリックOrderedSetを作成したいと考えています。 isEqualプロトコルの目的は異なるタイプのオブジェクトの等価性をテストできるようにすることですが、共通のプロトコルを共有します。このデザインが可能であるはずですが、私はレンガの壁に当たっています。ここでは、このコードの結果がでなければなりませんSwiftでカスタムequalsプロトコルを使用して順序付きセットを作成する方法は?

protocol BaseProtocol: DynamicEquality { 
    var baseText: String { get } 
    var baseNum: Int { get } 
} 

extension BaseProtocol { 
    func isEqual(_ otherObj: DynamicEquality) -> Bool { 
     if let otherBase = otherObj as? BaseProtocol { 
      return self.baseText == otherBase.baseText && 
       self.baseNum == otherBase.baseNum 
     } 

     return false 
    } 
} 

class ClassA: BaseProtocol { 
    var baseText = "" 
    var baseNum = 0 
} 

class ClassB: BaseProtocol { 
    var baseText = "" 
    var baseNum = 0 
} 

var orderedSet = OrderedSet<BaseProtocol>() 
let objA = ClassA() 
orderedSet.add(objA) 
let objB = ClassB() 
orderedSet.add(objB) 

...その後、OrderedSetは、次のように使用される

protocol DynamicEquality { 
    func isEqual(_ otherObj: DynamicEquality) -> Bool 
} 

struct OrderedSet<T: DynamicEquality> { 
    private(set) var objects: [T] = [] 

    func contains(_ obj: T) -> Bool { 
     for anObject in objects { 
      if obj.isEqual(anObject) { 
       return true 
      } 
     } 

     return false 
    } 

    mutating func add(_ obj: T) -> Bool { 
     if !self.contains(obj) { 
      objects.append(obj) 
      return true 
     } 

     return false 
    } 

    .... 
} 

...私は、一般的な順序集合のために、これまで持っているものですOBJAがセットに追加しかし、彼らはのisEqual(によると等しいためobjBない)、代わりに私はこのエラーを取得していること:

error: using 'BaseProtocol' as a concrete type conforming to protocol 'DynamicEquality' is not supported
var orderedSet = OrderedSet< BaseProtocol>()
                            ^

誰も私がしようとしてるものを達成する別の方法がありますか?

答えて

0

あなたは、BaseProtocolに準拠したクラスを実装BaseClassからカスタムクラスClassAClassB継承を作り、OrderedSetBaseClassを持つ要素を作成する必要があります。

class BaseClass: BaseProtocol { 
    var baseText: String { 
     get { 
      return "" 
     } 
    } 
    var baseNum: Int { 
     return 0 
    } 
} 

class ClassA: BaseClass { 
} 

class ClassB: BaseClass { 
} 

var orderedSet = OrderedSet<BaseClass>() 
let objA = ClassA() 
orderedSet.add(objA) 
let objB = ClassB() 
orderedSet.add(objB) 
+0

ありがとうございました。それは確かに可能ですが、基本クラスの代わりにプロトコルを使用しようとしています。なぜなら、1)StringをBaseProtocolに準拠するように拡張しています.2)その設計は、具体的なクラスが他のクラスから継承することを妨げます。決闘の遺産はありません。 –

関連する問題