Swift - Как написать функцию generi c max - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в Swift, и я хочу написать общую функцию c max, которая сравнивает два параметра и возвращает больший для базовых типов c, таких как Int, Double, et c.

func max<T>(_ num1:T, _ num2:T) -> T {
    return (num1 > num2) ? num1 : num2;
}

Но я обнаружил, что это не работает, сообщил, что двоичная операция '>' не может применяться к двум операндам 'T'.

Я видел пример с generi c add function Здесь

protocol Summable { static func +(lhs: Self, rhs: Self) -> Self }
extension Int: Summable {}
extension Double: Summable {}

func add<T: Summable>(x: T, y: T) -> T {
  return x + y
}

Так что я думаю, что у меня тоже должен быть протокол для моей функции max. Итак, это моя попытка:

protocol Comparable {
    static func >(lhs: Self, rhs: Self) -> Self
}
extension Int:Comparable {}
extension Double:Comparable {}

Но это не работает. Я знаю, что Swift предоставляет протокол Comparable, но я хочу попробовать его сам. Не могли бы вы помочь?

Ответы [ 2 ]

1 голос
/ 18 июня 2020
protocol TempComparable {
    static func >(lhs:Self, rhs:Self) -> Bool;
}

func max<T:TempComparable>(_ num1:T, _ num2:T) -> T {
    return (num1 > num2) ? num1 : num2;
}
0 голосов
/ 18 июня 2020

Что вам нужно, так это создать свой протокол как подпротокол Comparable и предоставить уникальное имя вместо того, чтобы называть его таким же, как существующий Тип, что вызывает путаницу. И реализовать требования протокола в расширении вашего протокола и согласовать требуемые типы с протоколом. Вот как:

protocol CustomComparable: Comparable {
    static func > (lhs: Self, rhs: Self) -> Self
}
extension CustomComparable {
    static func > (lhs: Self, rhs: Self) -> Self {
        lhs > rhs ? lhs : rhs
    }
}
extension Int: CustomComparable {}
extension Double: CustomComparable {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...