gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:48:46 25 4
gpt4 key购买 nike

是否可以给一个可选的通用参数一个默认值?

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

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

}

let myChannel = addChannel("myChannelName")

但是我收到一个错误提示

无法推断通用参数“T”的参数

这只是我想做的事情不可能的情况吗?

最佳答案

以你的方式是不可能的。仅给出上面的代码,什么类型是 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")

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

(更新 ~ Swift 5.2)

有时您想要 T 的默认类型.你可以通过重载来做到这一点。例如,您可能希望默认类型为 Never .在这种情况下,您可以像这样添加一个重载:

func addChannel<T>(name: String, data: T? = nil) -> Channel<T> { ... }
func addChannel(name: String) -> Channel<Never> {
addChannel(name: name, data: Optional<Never>.none)
}

有了它,您可以进行更简单的调用:

let myChannel = addChannel(name: "myChannelName") // Channel<Never>

关于swift - Swift 函数中可选泛型参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28458160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com