我有一个通用类:
class MyGeneric<Item>
{
}
我想为所有不是 Numeric 的类型添加扩展方法。
类似这样的东西(伪代码):
extension MyGeneric where Item: !Numeric
{
func myFuncForNonNumeric()
{
print("I am not Numeric!")
}
}
有没有办法指定这种约束?
答案 0 :(得分:4)
不,在Swift类型约束中没有办法说“不”。
也就是说,您将用它做什么?哪些算法可以应用于不能应用于数值类型的“非数值”类型类?类型类“非数字”上没有使用的方法。
这个概念也是有问题的,因为类型可以在随机的地方并在与文件一样小的范围内符合协议。例如,如果一个模块在内部将类型与数字相符,那么MyGeneric在其他模块中应如何表现?
MyGeneric<CustomStringConvertible>
的行为如何? Int是CustomStringConvertible,因此Item可以是CustomStringConvertible存在中的Int。是否存在此方法? (显而易见的答案是,因为CustomStringConvertible不是Numeric,但这是您的意思吗?有什么用?)
我想明确地说,所有这些问题并不意味着您最初的愿望是错误的或不可能的。仔细考虑,这可能是有用的。 And in that case, ideally, Swift would be evolved to support it.但是,这通常表明您正在寻找的工具与您真正想解决的问题不匹配,因此,进一步进行探索会很有帮助。