Ios 调用函数时显式指定泛型类型约束

Ios 调用函数时显式指定泛型类型约束,ios,swift,generics,Ios,Swift,Generics,我想知道在Swift中是否可以显式指定泛型函数的泛型类型。假设我有以下函数定义,它基本上创建了泛型类型的空数组T: func bar<T>() -> [T] { return [T]() } 导致 无法推断泛型参数“T” 这是完全有道理的,因为这里确实没有任何信息可以推断 但不幸的是,我尝试通过以下方式显式指定类型约束也失败了: var foo = bar<Int>() var foo=bar() 错误:无法显式专门化泛型函数 为什么我不能这样做 不

我想知道在
Swift
中是否可以显式指定泛型函数的泛型类型。假设我有以下函数定义,它基本上创建了泛型类型的空数组
T

func bar<T>() -> [T] {
    return [T]()
}
导致

无法推断泛型参数“T”

这是完全有道理的,因为这里确实没有任何信息可以推断

但不幸的是,我尝试通过以下方式显式指定类型约束也失败了:

var foo = bar<Int>()
var foo=bar()
错误:无法显式专门化泛型函数

  • 为什么我不能这样做
  • 不能显式指定泛型类型是语言规范吗
  • 有什么方法可以指定函数的泛型类型
有什么方法可以指定函数的泛型类型

可以从上下文推断泛型类型:

func bar<T>() -> [T] {
    return [T]()
}

let val1 = bar() as [Int] // or:
let val2 : [Int] = bar()
func bar()->[T]{
返回[T]()
}
将val1=bar()设为[Int]//或:
设val2:[Int]=bar()

(我无法回答其他问题。)

该语言不允许您显式地专门化函数。我不知道他们为什么用这种方式实施。您更有可能在swift用户邮件列表中找到该问题的答案

解决此问题的典型方法是使函数将类型作为参数:

func bar<T>(_: T.Type) -> [T] {
    return [T]()
}

bar(Int.self)
// Result: [], with type Array<Int>
func条(uu:T.Type)->[T]{
返回[T]()
}
条形图(Int.self)
//结果:[],类型为Array

好的,但是如果我的函数返回一个
(T,[(T,T[T]))
(我怀疑一个好的底层设计)例如,我将不得不在每个
T
-place中用
Int
重新键入整个类型?@luk2302:编译器必须以某种方式从上下文推断类型。如果您将
bar()
作为参数传递给接受数组参数的函数,那么它也应该可以工作也许会有一个更好的答案,但这正是我想出来的。是的,我知道它需要以某种方式获得类型,我基本上不明白为什么显式指定它不起作用-但无论如何,谢谢你!感谢您的回答和
Int.self
-解决方案。我可能会在邮件列表上发表我的第一篇文章,而不是仅仅阅读它。
func bar<T>(_: T.Type) -> [T] {
    return [T]()
}

bar(Int.self)
// Result: [], with type Array<Int>