swift - 如何为所有不符合特定协议的类型扩展泛型类?
问题描述
我有一个通用类:
class MyGeneric<Item>
{
}
我想为所有不是Numeric的类型添加一个扩展方法。
像这样的东西(伪代码):
extension MyGeneric where Item: !Numeric
{
func myFuncForNonNumeric()
{
print("I am not Numeric!")
}
}
有没有办法指定这样的约束?
解决方案
不,在 Swift 类型约束中没有办法说“不”。
也就是说,你会用这个做什么?什么算法可以应用于不能应用于 Numeric 类型的类型类“非 Numeric”?类型类“非数字”没有可使用的方法。
这个概念也是有问题的,因为类型可以在随机位置和文件一样小的范围内符合协议。例如,如果一个模块内部符合 Numeric 类型,那么 MyGeneric 在其他模块中应该如何表现?
这将如何表现MyGeneric<CustomStringConvertible>
?Int 是 CustomStringConvertible,因此 Item 可能是 CustomStringConvertible 存在的 Int。这种方法存在吗?(显而易见的答案是肯定的,因为 CustomStringConvertible 不是 Numeric,但这就是您的意思吗?这有什么用?)
我想明确一点,所有这些问题并不意味着你最初的愿望是错误的或不可能的。仔细考虑,它可能是可能的和有用的。在这种情况下,理想情况下,Swift 会进化到支持它。但这通常表明您正在寻找的工具与您真正想要解决的问题之间的不匹配,因此更多地探索它会有所帮助。
推荐阅读
- javascript - 如何将 HTML5 画布作为图像提交到 django 服务器
- opengl - 复杂变换后如何围绕世界坐标旋转
- mysql - 试图找到一种方法来组织空值,以便它们在表中显示在最后
- arrays - Angular 7 - 如何使用 json 数据集初始化数组对象?
- python - 如何使用 tf.keras.layers 通过 Tensorflow conv2d 输入批量图像序列
- angular - 引用 Angular 组件 (TypeScript) 类的属性
- javascript - 使用 Javascript 从数组或对象中提取值属性
- java - 有没有办法在 Swagger 中手动添加文件参数的文件格式?
- java - 我有问题如何为使用 REST api 方法进行 jUnit 测试
- html - 调整大小时保持 div 内联