Цель
Я хочу расширить базовые типы, такие как Int
, Double
, Float
... с более гибкими свойствами и сделать его презентабельным в диаграмме моего приложения. Например, я сделал диаграмму, которая подходит только для отображения Int
, но не может отображать Float
. Я хочу убедиться, что когда передаю аргументы этому представлению, он будет отображаться правильно.
Решение
Итак, я сделал протокол (для этого примера это было так):
protocol SimplyChartable {
static func max(_ dataSet: [SimplyChartable]) -> SimplyChartable
}
И затем сделайте расширение для некоторых типов:
extension Int: SimplyChartable { }
extension Double: SimplyChartable { }
extension Float: SimplyChartable { }
и т.д.
Проблема
Это будут все числовые типы, и всякий раз, когда я передаю его как числовые типы в func
, мне нужно расширить все расширения следующим образом:
public static func max(_ dataSet: [SimplyChartable]) -> SimplyChartable {
return (dataSet as? [Int])?.max() ?? 0
}
Но для Double
func будет идентичным.
Итак, для min я получаю аналогичную функцию, то же самое для деления, добавления, некоторой другой математики... Есть способ записать ее один раз и повторно использовать для каждого типа, который расширяет этот протокол?
Я узнал, что:
let dataType = type(of: maxValue) /* where `maxValue` is SimplyChartable*/
Вернет оригинальный тип как rawValue. Но вывод метода type(of
есть Metatype
, и я не могу вернуть его из функции, а затем добавить два значения этого типа. Так, например, этот код не будет работать:
let val1 = SimplyChartable(4)
let val2 = SimplyChartable(2)
let sum = val1 + val2
И как заставить его работать, не заканчивая тремя функциями вроде этого:
let val1 = SimplyChartable(4)
let val2 = SimplyChartable(2)
let sum = (val1 as! Int) + (val2 as! Int)