【问题标题】:cannot invoke 'append' with an argument list of type '(T)'无法使用类型为“(T)”的参数列表调用“附加”
【发布时间】:2017-02-27 02:10:36
【问题描述】:
在最新的 Playground 中尝试使用泛型类型编写堆栈时遇到了这个奇怪的错误。
我真的不明白这里出了什么问题,有人可以向我解释为什么我得到这个错误吗?
class MyStack<T> {
var stack1 = [T]()
func push<T>(value: T) {
stack1.append(value) // Error: cannot invoke 'append' with an argument list of type '(T)'
}
}
【问题讨论】:
标签:
arrays
swift
generics
【解决方案1】:
类已经是泛型的了,push 也不需要再泛型了
class MyStack<T> {
var stack1 = [T]()
func push(value: T) {
stack1.append(value)
}
}
当push 被声明为push<T> 时,泛型参数会覆盖类中定义的参数。所以,如果我们要重命名泛型参数,我们会得到
class MyStack<T1> {
var stack1 = [T1]()
func push<T2>(value: T2) {
stack1.append(value) // Error: cannot invoke 'append' with an argument list of type '(T2)'
}
}
这样呈现,我们不能在[T1] 中推送T2 是有道理的。