在Swift 4中,我创建了以下协议,以确定某些内容是否有+运算符
protocol Addable { static func +(lhs: Self, rhs: Self) -> Self }
现在我已经创建了一个名为Vector<T>
的类,其中T
当然是通用类型。
class Vector<T: Addable>: Addable {
var values: [T]
init(values: [T]) {
self.values = values
}
static func +(lhs: Vector<T>, rhs: Vector<T>) -> Self {
return lhs
}
}
+运算符实现的return lhs
部分只是暂时的。但由于某种原因,这给了我以下错误:
Cannot convert return expression of type 'Vector<T>' to return type 'Self'
知道我在这里做错了什么吗?我还没有得到线索。
答案 0 :(得分:2)
从评论中移出:
问题是由阶级无效性引起的。看起来Swift无法推断非最终类的返回Self
类型,因为当前类及其子类中的Self
意味着不同。但由于某些原因,参数中Self
没有这样的问题。
这个问题的解决方案是:
final
,并将Self
设置为正确的类型并且可以正常使用class
替换为struct
,并设置正确的类型默认添加associatedtype
Self
:
protocol Addable {
associatedtype S = Self
static func + (lhs: Self, rhs: Self) -> S
}
后期选项适用于非最终类,但应检查相关类型,它仍然等于Self
。