2017-05-05 4 views
0

基本的には、他のすべてのビューモデルを定義できる汎用ビューモデルを定義しようとしていますが、それらのデータは汎用性を維持する必要があります。以下のようなプロトコルを定義します。汎用プロトコルでViewModelデータをインスタンス化する

protocol GenericVMProtocol { 
    associatedtype T 

    var items: [T] { get } 
} 

次に、私はそれに私のVMに準拠してデータを定義します。

class VM: GenericVMProtocol { 
    typealias T = String 
    var items: [String] = ["A", "B" , "C"] 
} 

今ではすべてが期待通りに働いているが、私は私のVCを準拠するようにしたいときに問題が起こるためVMProtocol so:

class VC: UIViewController { 

    var vm: GenericVMProtocol 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     vm = VM() 
     super.init(nibName: nil, bundle: nil) 
    } 

    func items() { 
     print(vm.items) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError() 
    } 
} 

イム取得エラー:

Protocol 'GenericVMProtocol' can only be used as a generic constraint because it has Self or associated type requirements

...そして私は、私は任意の助けをいただければ幸いです..私は、私はいくつかのロジックを欠けているか、私の考えが間違っている場合は、かなり無知だと言わなければなりません! TNX :)これは、あなたが直接型としてGenericVMProtocolを使用することはできませんPAT(プロトコル関連するタイプ)の問題がある

答えて

0

ため再びit has associated type requirements私は次のようにあなたが、正しい方法で使用するのに役立ちます場合は知らない

あなたのケースで一般的な制約を持つプロトコルは、次のとおりです。

protocol GenericVMProtocol { 
associatedtype T 

var items: [T] { get } 
init() 
} 

class VM: GenericVMProtocol { 
    typealias T = String 
    var items: [String] = ["A", "B" , "C"] 
    required init() {} 
} 

class VC<T>: UIViewController where T:GenericVMProtocol { 


var vm: T 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    vm = T() 
    super.init(nibName: nil, bundle: nil) 
} 

func items() { 
    print(vm.items) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError() 
} 
} 
関連する問題