簡體   English   中英

Swift 2.0:不能將泛型作為參數傳遞

[英]Swift 2.0: can not pass generic as a parameter

為什么這不起作用(即使Container符合Unique協議。)以及最好的解決方法是什么樣的?

protocol Unique {
    var uniqueId: String {get}
}

struct Container <T>: Unique {
    typealias UnderlyingObject = T
    var object: UnderlyingObject
    var uniqueId: String
}

func myFunc(protocolClosure: (Unique, Unique) -> Unique) {
    print("...")
}

func problemStartsHere<T,S,U>(paramClosure: (Container<T>, Container<S>) -> Container<U>) {
    myFunc(paramClosure)
}

在此輸入圖像描述

這里的問題是方差之一,盡管不是你正在尋找的方差。 因為你傳遞了一個閉包,所以你真的試圖使方法簽名本身匹配,而不是傳遞給方法本身或從方法返回的值。 如果,例如, myFunc嘗試使用Container<T>以外的類型的參數調用閉包,並且因為它期望任何Unique對於該調用是可接受的,那么這可能會引發問題,它會編譯得很好。

編譯器顯示此警告的原因是: myFunc期望一個閉包適用於任何類型的Unique而不僅僅是Container<T>

您應該使用該函數的通用版本:

func myFunc<A: Unique, B: Unique, C: Unique>(protocolClosure: (A, B) -> C) {
    print("...")
}

編輯:假設您想調用您的函數問題problemStartsHere如下:

problemStartsHere { (c1: Container<Int>, c2: Container<Int>) -> Container<Int> in
    print(c1.object, c2.object)
    return c1
}

請注意,該函數使用Container -specific屬性object 不是編譯器應該如何創建一個適用於任何Unique的閉包? 它不能像這樣工作,因為它沒有意義,這樣的功能不能在任何Unique上工作。

問題是返回值。 雖然您可以將任何Container<...>傳遞給Unique參數,但Unique類型的返回值無法強制轉換為Container<...> 這就是封閉類型(Container<...>, Container<...>) -> Container<...>無法轉換為(Unique, Unique) -> Unique

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM