採取類型名稱在C#中,有可能通過指定類型調用一個泛型方法:通用功能斯威夫特
public T f<T>()
{
return something as T
}
var x = f<string>()
斯威夫特不允許你調用它時專門的通用方法。編譯器要依靠類型推斷,所以這是不可能的:
func f<T>() -> T? {
return something as T?
}
let x = f<String>() // not allowed in Swift
我需要的是一個的方式來傳遞一個類型的函數,該函數返回該類型的對象,使用泛型
這工作,但它不是一個很適合我想做的事:
let x = f() as String?
編輯(澄清)
我可能並不十分清楚問題實際是什麼,它只是用於調用返回給定類型(任何類型)的函數的簡單語法。
舉一個簡單的例子,假設你有任何一個數組,你創建一個返回給定類型的第一個元素的功能:
// returns the first element in the array of that type
func findFirst<T>(array: [Any]) -> T? {
return array.filter() { $0 is T }.first as? T
}
你可以調用這個函數是這樣的:
let array = [something,something,something,...]
let x = findFirst(array) as String?
這很簡單,但如果返回的類型是一些協議與方法,並且要調用該方法返回的對象:
(findFirst(array) as MyProtocol?)?.SomeMethodInMyProtocol()
(findFirst(array) as OtherProtocol?)?.SomeMethodInOtherProtocol()
該語法只是尷尬。在C#中(與Swift類似),你可以這樣做:
findFirst<MyProtocol>(array).SomeMethodInMyProtocol();
不幸的是,這在Swift中是不可能的。
所以問題是:有沒有一種方法可以用更簡潔(不太笨拙)的語法來實現這一點。
someFunc()去尋找所提供的類型的對象,並將其返回。就這麼簡單。我想提供最少量的信息,因爲具體細節和「爲什麼」是無關緊要的。 –
@PhilippeLeybaert請你澄清你的問題。你說'T'可以是任何協議,但是你不能創建一個協議的實例。協議是抽象的 - 你只能創建一個符合給定協議的* concrete *類型的實例。 「具體」與這個問題絕對相關。我不確定是否嘗試將函數輸出與給定類型進行比較,並且只有在符合該類型的情況下才會返回它,或者如果您嘗試創建傳入的給定類型的新實例。 – Hamish
我不需要創建實例。該函數將查找符合該協議的對象,然後將其返回。不需要創建新的對象。 –