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

ham*_*man 9 generics swift

是否可以为可选的泛型参数提供默认值?

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

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

}

let myChannel = addChannel("myChannelName")
Run Code Online (Sandbox Code Playgroud)

但是我说错了

Argument for generic parameter 'T' could not be inferred

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

Rob*_*ier 13

你完成它的方式是不可能的.只给出上面的代码,是什么类型的T?正如它所说的那样,编译器无法弄明白(我也不能,而且我认为你也不能,因为数据不存在).

特定问题的解决方案是重载而不是使用默认值:

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

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

let myChannel = addChannel("myChannelName")
Run Code Online (Sandbox Code Playgroud)

但它提出了你在这里做什么的问题.你会认为那Channel应该是Channel<T>.否则,你在做什么data?如果不诉诸Any(你应该强烈避免),很难看出你的函数除了忽略之外什么都可以做data.

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

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

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

  • 首选的方法不是“任何类型的 Dictionary、Int 或 String”。确定它到底是什么类型。这可能是包含其中任何一个的“数据”类型。您可以将其实现为具有关联数据的枚举。这样您就可以确保收到您所期望的内容,而不仅仅是“AnyObject”。当你开始获取 AnyObject 时?根据我的经验,进入你的系统后,事情会很快变得糟糕。即使不考虑设计问题,编译器也讨厌它。 (2认同)