1. ホーム
  2. ios

[解決済み] swiftにおけるプロトコルの配列型および関数パラメータとしての使用法

2022-05-12 21:23:45

質問

あるプロトコルに準拠したオブジェクトを格納するクラスを作りたい。 オブジェクトは型付き配列に格納される必要があります。Swiftのドキュメントによると、プロトコルは型として使用することができます。 

型であるため、他の型が許可されている多くの場所でプロトコルを使用することができます。

  • 関数、メソッド、またはイニシャライザでパラメータ型または戻り値型として使用する。
  • 定数、変数、またはプロパティの型として
  • 配列、辞書、またはその他のコンテナ内のアイテムの型として

しかし、以下のようにするとコンパイラエラーが発生します。

プロトコル 'SomeProtocol' は Self または関連する型の要件を持っているため、一般的な制約としてのみ使用することができます。

どうやって解決するんだ。

protocol SomeProtocol: Equatable {
    func bla()
}

class SomeClass {
    
    var protocols = [SomeProtocol]()
    
    func addElement(element: SomeProtocol) {
        self.protocols.append(element)
    }
    
    func removeElement(element: SomeProtocol) {
        if let index = find(self.protocols, element) {
            self.protocols.removeAtIndex(index)
        }
    }
}

どのように解決するのですか?

あなたは、まだ良い解決策が存在しないSwiftのプロトコルの問題の亜種にぶつかりました。

参照 Swift でソートされているかどうかを確認するために Array を拡張する? を参照してください、それはあなたの特定の問題に適しているかもしれないそれを回避する方法についての提案を含んでいます(あなたの質問は非常に一般的です、多分あなたはこれらの答えを使って回避策を見つけることができます)。