2016-11-21 22 views
1

我正在嘗試創建一個可以返回任何類型的函數。我做希望它返回Any類型的對象,但其他類型,即StringBoolInt,等你的想法。從Swift中的函數返回任何類型

您可以輕鬆地做到這一點使用泛型以這種方式:

func example<T>(_ arg: T) -> T { 
    // Stuff here 
} 

但有可能做到這一點,而不傳遞同一類型的任何參數?以下是我想到的是:

func example<T>() -> T { 
    // Stuff here 
} 

當我嘗試這樣做,一切正常,直到我調用的函數,然後我得到這個錯誤:

generic parameter 'T' could not be inferred 

回答

4

is it possible to do it without passing in any arguments of the same type?

答案是肯定的,但編譯器需要有一種方法來推斷通用函數的正確版本。如果它知道將結果分配給它,它將起作用。因此,例如,您可以明確鍵入letvar聲明。下面在斯威夫特3的操場上工作。

protocol Fooable 
{ 
    init() 
} 

extension Int: Fooable {} 
extension String: Fooable {} 

func foo<T: Fooable>() -> T 
{ 
    return T() 
} 

let x: String = foo() // x is assigned the empty string 
let y: Int = foo() // y is assigned 0