如何为不符合特定协议的所有类型扩展通用类?

时间:2019-03-31 14:05:57

标签: swift generics type-constraints

我有一个通用类:

class MyGeneric<Item>
{
}

我想为所有不是 Numeric 的类型添加扩展方法。

类似这样的东西(伪代码):

extension MyGeneric where Item: !Numeric
{
   func myFuncForNonNumeric()
   {
      print("I am not Numeric!")
   }
}

有没有办法指定这种约束?

1 个答案:

答案 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.但是,这通常表明您正在寻找的工具与您真正想解决的问题不匹配,因此,进一步进行探索会很有帮助。