我有一个通用类:
class MyGeneric<Item>
{
}
我想为所有不是Numeric的类型添加扩展方法。
像这样的东西(伪代码):
extension MyGeneric where Item: !Numeric
{
func myFuncForNonNumeric()
{
print("I am not Numeric!")
}
}
有没有办法指定这样的约束?
不,在Swift类型约束中没有办法说“不”。
那说,你会用它做什么?什么算法可以应用于不能应用于数字类型的类型类“非数字”?类型类“非数字”没有使用它的方法。
这个概念也存在问题,因为类型可以在随机位置和小到文件的范围内符合协议。例如,如果一个模块在内部使类型符合Numeric,那么MyGeneric应该如何在其他模块中运行?
这对MyGeneric<CustomStringConvertible>
有何影响? Int是CustomStringConvertible,因此Item可以是CustomStringConvertible存在中的Int。这种方法存在吗? (显而易见的答案是肯定的,因为CustomStringConvertible不是数字,但这是什么意思?这有什么用?)
我想清楚的是,所有这些问题并不意味着你最初的愿望是错误的或不可能的。仔细考虑,它可能是有用的。 And in that case, ideally, Swift would be evolved to support it.但它经常指出你正在寻找的工具和你真正试图解决的问题之间的不匹配,所以探索更多的东西是有帮助的。