Swift — Как перегрузить = для Int, чтобы передать оператор в качестве параметра при вызове функции, например nextPage(страница: pageIndex = 1)?

#ios #swift #math #operator-overloading #inout

#iOS #swift #математика #оператор-перегрузка #inout

Вопрос:

Я хотел бы знать, как я могу сделать следующее, пожалуйста:-

     // This is not correct
    func  = (inout lhs: Int, rhs: Int) -> Int {
        return lhs   rhs
    }


Objective Usage:- scrollTo(pageIndex: pageIndex  = 1)

  

Ответ №1:

Ваш код близок, но ему нужно выполнить две вещи:

  1. Добавьте правую сторону в левую сторону
  2. Верните новое значение.

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

 func  = (lhs: inout Int, rhs: Int) -> Int {
    lhs = lhs   rhs
    return lhs
}
  

Но есть еще одна проблема; стандартный оператор = имеет void возвращаемый тип, и вы определили новый оператор с Int возвращаемым типом.

Если вы попытаетесь использовать = оператор в контексте, где допустим возвращаемый тип void (что является обычным использованием этого оператора), компилятор выдаст ошибку неоднозначности, поскольку он не может определить, какую функцию он должен использовать:

 someIndex  = 1   // This will give an ambiguity compile time error
  

Вы можете решить эту проблему, определив оператор с использованием обобщений, где аргументы соответствуют AdditiveArithmetic (спасибо @NewDev за этот совет)
:

 func  =<T: AdditiveArithmetic> (lhs: inout T, rhs: T) -> T {
    lhs = lhs   rhs
    return lhs
}
  

Однако я должен сказать, что это кажется довольно сложным, когда у вас может быть просто две строки кода; одна для увеличения pageIndex , а затем вызов функции.

Комментарии:

1. Спасибо за ответ, это в значительной степени то, что мне нужно, я действительно надеялся, что смогу использовать = но да, я понимаю, что это вызывает ошибку неоднозначности, но мне просто интересно, есть ли способ переопределить существующее поведение, чтобы оно вело себя так, как должно, но также и в дополнениедля этого я могу передать его в качестве аргумента, используя = вместо amp;= ? извините, если это глупый вопрос, но я должен спросить :]

2. Нет, потому что вы не переопределяете исходный оператор. Исходный оператор func =(Int,Int)->Void и новый оператор func =(Int,Int)->Int — нет способа сообщить компилятору, какой из них вы имеете в виду в контексте без присваивания.

3. Вы также можете решить эту проблему, заставив эту перегрузку использовать общий, поэтому у нее более низкий приоритет по сравнению с обычным = : func =<T: AdditiveArithmetic>(lhs: inout T, rhs: T) -> T {...}

4. Вы могли бы разрешить двусмысленность в случае, подобном этому (i = 20) as Void , но, как вы можете видеть, это действительно паршиво.

5. @vacawama Да, вы также можете использовать let _:Int = i = 1 , что еще хуже :). Общее решение хорошее.

Ответ №2:

Я не уверен, понял ли я вас, но если бы я это сделал, я был бы чем-то вроде этого

функция nextPage(n1: Int) -> Int {

номер переменной = n1 1 возвращаемый номер }