#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:
Ваш код близок, но ему нужно выполнить две вещи:
- Добавьте правую сторону в левую сторону
- Верните новое значение.
Ваш код возвращает только новое значение, он не обновляет значение левой стороны. Теоретически, вы могли бы использовать это:
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 возвращаемый номер }