2015-02-11 118 views
5

是否可以将可选通用参数设置为默认值?Swift函数中可选通用参数的默认值

我试图做这样的事情:

func addChannel<T>(name: String, data: T? = nil) -> Channel { 

} 

let myChannel = addChannel("myChannelName") 

但我发现了一个错误说

Argument for generic parameter 'T' could not be inferred

难道只是我想要的情况下做不成?

回答

5

这是不可能的,你已经做到了。只给出上面的代码,什么类型是T?正如它所说的,编译器无法弄清楚(我也不能,也不能假定你不能,因为数据不在那里)。

解决的具体问题是超载,而不是使用默认值:

func addChannel<T>(name: String, data: T?) -> Channel { ... } 

func addChannel(name: String) -> Channel { ... } 

let myChannel = addChannel("myChannelName") 

但它提出的你正在做什么这里的问题。你会认为Channel应该是Channel<T>。否则,你在做什么data?不诉诸Any(你应该避免),很难看到你的功能如何做,但忽略data

随着Channel<T>你可以只使用一个默认的,但你必须提供类型:

func addChannel<T>(name: String, data: T? = nil) -> Channel<T> { ... } 
let myChannel: Channel<Int> = addChannel("myChannelName") 

否则编译器会不知道你在做什么样的渠道。

+0

好的,这很有道理 - 我只是误解了如何使用泛型。我的用例是'data'可以是任何类型的Dictionary,Int或String,或者它可以是零。是做这种做'data:AnyObject的首选方法? = nil',然后检查函数内的数据类型? – hamchapman 2015-02-11 15:46:35

+1

这样做的首选方法不是“任何类型的Dictionary,Int或String”。确定它是什么类型。这可能是一个“数据”类型,可能包含任何这些类型。你将它作为一个带有关联数据的枚举来实现。这样你就可以确保你收到你期望的东西,而不仅仅是“AnyObject”。当你开始获得AnyObject?进入你的系统,根据我的经验,事情会变得非常糟糕。即使对设计问题进行了折扣,编译器也不喜欢它。 – 2015-02-11 15:47:52

+0

有关Enumerations的更多信息,这些是Swift中的关键类型,请参阅https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html。 – 2015-02-11 15:49:56