16369


プロトコルを定義してそのプロトコルに準拠したクラスの配列を定義したいのですが、良い書き方はありますでしょうか？

プロトコルの定義は以下のような実装で、複数のプロパティとメソッドが定義されています。

[code]

    protocol ProtocolA {
        var property: AnyObject { get }
        func someMethod()   
    }
    
[/code]

実際にはこのような形でViewにプロトコルに準拠したクラスの配列を保持したいです。

[code]

    class View: UIView {
        var objects ←　これをProtocolAに準拠したクラスの配列にしたい
    }
    
[/code]

このような形も考えましたが、Storyboard上での使用も考え諦めました。

[code]

    class View<T: ProtocolA>: UIView {
        var objects = [T]()
    }
    
[/code]

使用用途としては

[code]

    class View: UIView {
        func someMethod<T: ProtocolA>(objects: [T]) {
            // このobjectsをプロパティとして保持したい
        } 
    }
    
[/code]

ジェネリクスを使用したプログラミング経験があまりなく不可解な説明があるかもしれませんが、よろしくおねがいします。


CC BY-SA 3.0
2015-09-08T05:47:30.730
16367
2019-06-29T08:53:08.723
2019-06-29T08:53:08.723
9008
12242
question
swift ios ジェネリクス
Swiftでプロトコルに準拠したクラスの配列を定義したい


普通に、ProtocolAの配列を使う形でどうでしょうか？  
（Xcode7 beta6で動作を確認）

[code]

    protocol ProtocolA {
        var property: AnyObject { get }
        func someMethod()
    }
    
    class View: UIView {
    //  var objects ←　これをProtocolAに準拠したクラスの配列にしたい
        var objects = [ProtocolA]()     // ProtocolAの配列を作成
    
        func someMethod(objects: [ProtocolA]) {
            // このobjectsをプロパティとして保持したい
            self.objects = objects      // ProtocolAの配列をコピー
        }
    
        // MARK: - 以下、コメントへの回答として追加
    
        /// 保存したプロパティをメソッド引数として渡す
        func execOtherMethod() {
            if let obj = objects.last {
                otherMethod(obj)
            }
        }
    
        /// Protocolを直接使用する
        func otherMethod(object: ProtocolA) {
            object.someMethod()
        }
    
        /// Genericsを使うパターン（コンパイルエラーになる）
    //  func otherMethod<T: ProtocolA>(object: T) {
    //      object.someMethod()
    //  }
    
    }
    
    /// ProtocolAに準拠したクラス
    class ClassA: ProtocolA {
        var property: AnyObject { return "A" }
        func someMethod() { print("A")  }
    }
    
    // someMethodを呼び出し
    let vi = View()
    let obj = ClassA()
    vi.someMethod([obj])
    
    // Protocolを引数に使うテスト
    vi.execOtherMethod()
    
[/code]


CC BY-SA 3.0
2015-09-08T06:31:26.987
16369
2015-09-09T02:11:27.760
2015-09-09T02:11:27.760
7459
7459
16367
answer