三這個代碼的問題:的參數一般T.Type甚至不使用,以逗號分隔的制約
func register<T: UICollectionViewCell where T: ReusableView, T: NibLoadableView>(_: T.Type) {
let bundle = NSBundle(forClass: T.self)
let nib = UINib(nibName: T.nibName, bundle: bundle)
registerNib(nib, forCellWithReuseIdentifier: T.defaultReuseIdentifier)
}
(_: T.Type)
。此func
中的代碼塊甚至不使用此參數。那麼爲什麼T.Type
甚至是必要的,它爲什麼要將.Type
添加到泛型?這條線
T: UICollectionViewCell where T: ReusableView, T: NibLoadableView
,它意味着:(a)中T被約束到鍵入UICollectionViewCell符合該協議ReusableView 和 NibLoadableView?
(b)或它意味着它符合ReusableView 或 NibLoadableView?
第三個問題來自上面的例子,但它沒有直接關係。我可以欣賞一種限制於特定類型的泛型;但是當泛型被限制爲一種類型時,我沒有看到它與輸入變量的正常類型聲明之間的區別。見下面
碼這是什麼之間的區別:聲稱register
只希望受限於一種
func register(whatever: UICollectionViewCell) {
// whatever
}
不要上述兩個聲明:
func register<T: UICollectionViewCell>(whatever: T) {
// whatever
}
這UICollectionViewCell
?他們如何或在什麼情況下有所不同?
(上下文的示例代碼從萃取:https://gist.github.com/gonzalezreal/92507b53d2b1e267d49a)