首页 > 解决方案 > 如何为所有不符合特定协议的类型扩展泛型类?

问题描述

我有一个通用类:

class MyGeneric<Item>
{
}

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

像这样的东西(伪代码):

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

有没有办法指定这样的约束?

标签: swiftgenericstype-constraints

解决方案


不,在 Swift 类型约束中没有办法说“不”。

也就是说,你会用这个做什么?什么算法可以应用于不能应用于 Numeric 类型的类型类“非 Numeric”?类型类“非数字”没有可使用的方法。

这个概念也是有问题的,因为类型可以在随机位置和文件一样小的范围内符合协议。例如,如果一个模块内部符合 Numeric 类型,那么 MyGeneric 在其他模块中应该如何表现?

这将如何表现MyGeneric<CustomStringConvertible>?Int 是 CustomStringConvertible,因此 Item 可能是 CustomStringConvertible 存在的 Int。这种方法存在吗?(显而易见的答案是肯定的,因为 CustomStringConvertible 不是 Numeric,但这就是您的意思吗?这有什么用?)

我想明确一点,所有这些问题并不意味着你最初的愿望是错误的或不可能的。仔细考虑,它可能是可能的和有用的。在这种情况下,理想情况下,Swift 会进化到支持它。但这通常表明您正在寻找的工具与您真正想要解决的问题之间的不匹配,因此更多地探索它会有所帮助。


推荐阅读