gpt4 book ai didi

swift - 当没有参数提供泛型类型时,如何调用泛型 Swift 函数?

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:11 26 4
gpt4 key购买 nike

以下在 Swift REPL 中编译:

var m: [String:AnyObject] = [:]
func f<T: AnyObject>(s: String) {
m[s] = T.self
}

但是,如果我天真地尝试调用 f() ,因此:

let s: String = "foo"
class Foo {}
f<Foo>(s)

我收到这个错误:

repl.swift:7:1: error: cannot explicitly specialize a generic function
f<Foo>(s)
^
repl.swift:7:2: note: while parsing this '<' as a type parameter bracket
f<Foo>(s)
^

如果我在没有“明确专门化”的情况下尝试它......

f(s)

Swift 决定我要尝试做一些更奇怪的事情,然后我得到:

repl.swift:7:1: error: cannot convert the expression's type 'String' to type '()'
f(s)
^~~~

与此同时,但是,如果我定义一个新函数 g()如下:

func g<T: AnyObject>(s: String, t: T) {
m[s] = T.self
}

并传入一个虚拟 Foo实例:

g(s, Foo())

它工作正常:

> m
$R0: [String : AnyObject] = {
[0] = {
key = "foo"
value = {
instance_type = {}
}
}
}

那么 Swift 让我定义 f() 是有原因的吗?首先?一旦定义,是否有任何方法可以调用它?


预计到达时间:我知道也可以定义一个函数 h<T: AnyObject>(s: String, t: T.Type)明确采用类型。事实上,Swift 允许我定义我认为有问题的隐式版本。

最佳答案

与其他语言不同,您不能使用如下语法显式指定泛型类型:

f<Foo>(s)

相反,实际类型是通过参数或返回类型推断的。在您的情况下,您没有提供一种类型推断方法来确定 T 是什么。遗憾的是,我不知道有任何方法可以使用该功能。

我的建议是显式传递 T 的类型:

func f<T: AnyObject>(s: String, type: T.Type) {
m[s] = type
}

...

f(s, Foo.self)

关于swift - 当没有参数提供泛型类型时,如何调用泛型 Swift 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28726937/

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