小编Max*_*Max的帖子

在协议扩展上进行数学运算的通用方法

目标

我想延长基本类型,如Int,Double,Float...更灵活的特性,使之在我的应用程序在图表中呈现的.例如,我制作的图表绘制仅适用于显示Int但不能真正显示Float.我想确保当我将参数传递给此视图时它将正确显示.

所以我制作了一个协议(这个例子就是这样的):

protocol SimplyChartable { 
        static func max(_ dataSet: [SimplyChartable]) -> SimplyChartable
}
Run Code Online (Sandbox Code Playgroud)

然后为某些类型进行扩展:

extension Int: SimplyChartable { }
extension Double: SimplyChartable { } 
extension Float: SimplyChartable { } 
Run Code Online (Sandbox Code Playgroud)

等等 ...

问题

这将是所有数字类型,每当我将它作为数字类型传递给func我时,我需要像这样扩展所有扩展:

public static func max(_ dataSet: [SimplyChartable]) -> SimplyChartable { 
    return (dataSet as? [Int])?.max() ?? 0
}
Run Code Online (Sandbox Code Playgroud)

但对于Doublefunc将是相同的.

因此,对于min,我将最终得到类似的功能,对于除法,添加,一些其他数学也是如此...有一种方法可以将其写入一次并重用于扩展此协议的每种类型?

我发现:

    let dataType = type(of: maxValue) /* where `maxValue` is SimplyChartable*/
Run Code Online (Sandbox Code Playgroud)

将原始类型返回为rawValue.但是方法的输出type(of …

generics protocols swift

10
推荐指数
1
解决办法
374
查看次数

标签 统计

generics ×1

protocols ×1

swift ×1