Swift函数中可选泛型参数的默认值

时间:2015-02-11 15:31:15

标签: swift generics

是否可以为可选的通用参数提供默认值?

我正在尝试做这样的事情:

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

}

let myChannel = addChannel("myChannelName")

但是我收到了一个错误

Argument for generic parameter 'T' could not be inferred

这只是我想要做的事情的一个例子吗?

2 个答案:

答案 0 :(得分:11)

你完成它的方式是不可能的。只给出上面的代码,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")

否则编译器就不知道你正在制作什么样的频道。

答案 1 :(得分:0)

我遇到了同样的问题。虽然传统上无法使用通用默认值 - 完全忽略参数 - 我更喜欢下面的实现重载:

let myChannel=addChannel("myChannelName", data: Optional<Any>.none)