//Swift2.2:
//修改anyCommonElements函数来创建一个函数,返回一个数组,内容是两个序列的共有元素。
func anyCommonElements2<T,U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, _ rhs: U) -> T {
var result = [T.Generator.Element]()//在这里也会报错
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
result.append(rhsItem) //在这里报错
}
}
}
return result
}
xcode7.3 swift2.2
result.append() 报 Cannot invoke "append" with an argument list of type "(T.Generator.Element)"
我是初学者。请大佬指点。多谢。
> var result:[T.Generator.Element] = []
> var result = [] as [T.Generator.Element]
> var result = Array< T.Generator.Element>()
该类已经是通用的,也无需使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)'
}
}
提出这个样子,这是有道理的,我们不能把一个T2
在[T1]
。
因为result中只能包含相同类型的元素。
不要用var
直接声明类型,
是这样。明白了。多谢。