2017-05-05 66 views
0

所以基本上我試圖定義一個通用的viewmodel協議,從中我可以定義所有其他視圖模型...但是其中的數據需要保持通用...讓我說我定義協議象下面這樣:使用通用協議實例化ViewModel數據

protocol GenericVMProtocol { 
    associatedtype T 

    var items: [T] { get } 
} 

接下來,我符合我的虛擬機,並定義數據:

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

現在一切工作正常,但是當我要遵守我的VC發生問題VMP協議像這樣:

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 :)

回答

0

這是一個PAT(協議相關聯的類型)的問題,你不能直接使用GenericVMProtocol類型,因爲再次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() 
} 
}