2016-12-27 36 views
1

三這個代碼的問題:的參數一般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) 
} 
  1. (_: T.Type)。此func中的代碼塊甚至不使用此參數。那麼爲什麼T.Type甚至是必要的,它爲什麼要將.Type添加到泛型?

  2. 這條線T: UICollectionViewCell where T: ReusableView, T: NibLoadableView,它意味着:

    (a)中T被約束到鍵入UICollectionViewCell符合該協議ReusableView NibLoadableView?

    (b)或它意味着它符合ReusableView NibLoadableView?

  3. 第三個問題來自上面的例子,但它沒有直接關係。我可以欣賞一種限制於特定類型的泛型;但是當泛型被限制爲一種類型時,我沒有看到它與輸入變量的正常類型聲明之間的區別。見下面

碼這是什麼之間的區別:聲稱register只希望受限於一種

func register(whatever: UICollectionViewCell) { 
    // whatever 
} 

不要上述兩個聲明:

func register<T: UICollectionViewCell>(whatever: T) { 
    // whatever 
} 

UICollectionViewCell?他們如何或在什麼情況下有所不同?


(上下文的示例代碼從萃取:https://gist.github.com/gonzalezreal/92507b53d2b1e267d49a

回答

3
  1. 這意味着,參數是一個元類型。該參數被賦予一個類型(一個元類型),而不是該類型的一個實例。這裏有一個例子:

    func f<T>(_: T.Type) { 
        print(T.self) //Prints "String" 
    } 
    
    f(String.self) // A metatype, not an instance of String 
    
  2. 這意味着

  3. 就其本身而言,沒有太大區別。第一個例子是使用泛型,第二個例子是使用多態。以下是它們不同的示例:

    protocol Repairable { 
        var broken: Bool { get set} 
    } 
    
    class Vehicle: Repairable { 
        var broken = true 
    } 
    
    class CheapRepairableTrinket: Repairable { 
        var broken = true 
    } 
    
    func repair<T: Repairable>(_ object: T) -> T { 
        var object = object 
        object.broken = false 
    
        // The return type *must* be the same as the type of the parameter 
        return object 
    } 
    
    func scamRepair(_ object: Repairable) -> Repairable { 
        // the parameter type and the return type can be any Repairable 
        // type, but there's no enforced relationship between them 
        return CheapRepairableTrinket() 
    } 
    
    // I gave them a car to fix, and they gave me back some other crap! 
    print(type(of: scamRepair(Vehicle())))