我正在试图理解我做错了什么。
我创建了一个泛型类,与bellow一样(不要注意代码的目的,只是为了显示错误)
我需要定义'+'对A类的两个实例意味着什么。不幸的是,swift抱怨
无法将“A”类型的值转换为预期参数类型“A< _>”
的
public static func +(lhs: A<T>, rhs: A<T>) -> A<T> {
return A.foobar(lhs: lhs, rhs: rhs, operation: +);
}
我不知道为什么......
以下是代码:
import Foundation
public struct A<T:Equatable&CustomStringConvertible> {
public let uu:T
public init(uu:T){
self.uu = uu;
}
}
extension A:Equatable {
public static func ==(lhs: A<T>, rhs: A<T>) -> Bool {
return lhs.uu == rhs.uu
}
public static func +(lhs: A<T>, rhs: A<T>) -> A<T> {
return A.foobar(lhs: lhs, rhs: rhs, operation: +);
}
fileprivate static func foobar(lhs: A<T>, rhs: A<T>, operation: (T, T) -> T) -> A<T> {
return A<T>(uu:lhs.uu)
}
}
有人可以帮忙吗?
编辑: 为避免混淆,foobar可以替换为:
fileprivate static func foobar(lhs: A<T>, rhs: A<T>, operation: (T, T) -> T) -> A<T> {
return A<T>(uu:operation(lhs.uu,rhs.uu))
}
答案 0 :(得分:1)
错误消息具有误导性。真正的问题是存在
在给定限制下,没有+
类型为(T, T) -> T)
的运算符。
一个选项可能是限制T
符合Numeric
协议,
这需要加法,减法和乘法运算符:
public struct A<T:Equatable & CustomStringConvertible & Numeric> { ... }
标准整数和浮点类型符合此协议。
另请注意extension A
内A
对A<T>
的任何引用
通用占位符默认为extension A: Equatable {
public static func ==(lhs: A, rhs: A) -> Bool {
return lhs.uu == rhs.uu
}
public static func +(lhs: A, rhs: A) -> A {
return A.foobar(lhs: lhs, rhs: rhs, operation: +);
}
fileprivate static func foobar(lhs: A, rhs: A, operation: (T, T) -> T) -> A {
return A(uu: operation(lhs.uu, rhs.uu))
}
}
,因此您可以简化。{
代码
YEAR (AJ) =year(AI2)+(month(AI2)>=$d$1)