Как написать функции Swift infix?
Я видел, как это делается,но я просто не могу понять это. Как-то, казалось бы, волшебно, некоторые функции infix работают нормально, но другие просто не компилируются. Например:
как вы видите здесь, мой then
функция работает как традиционная функция, но не как инфикс, но мой *
у одного есть противоположная проблема. какой волшебный соус, чтобы получить мой then
функция должна быть инфиксной?
сторону вопрос: Почему мой *
функция работает как традиционная функция?
код для чтения только текста и копирования вставки:
public func * (let left:String, let right:Int) -> String {
if right <= 0 {
return ""
}
var result = left
for _ in 1..<right {
result += left
}
return result
}
*("Left", 6) // error: '*' is not a prefix unary operator
"Left" * 6 // "LeftLeftLeftLeftLeftLeft"
public func then (let left:String, let _ right:String) -> String {
return left + right
}
then("Left", "Right") // "LeftRight"
"Left" then "Right" // 2 errors: Consecutive statements on a line must be separated by ';'
2 ответов
стандартная библиотека Swift уже определяет *
в качестве оператора infix:
infix operator * {
associativity left
precedence 150
}
вы найдете список предопределенных операторов
Swift Стандартные Операторы Библиотеки Ссылка. Кроме того, "command-click" на import Swift
оператор в Xcode и поиск "оператора".
чтобы использовать оператор в" традиционном " вызове функции, вы должны заключить его в скобки:
(*)("Left", 6)
если вы хотите определить свой собственный infix оператор, вы должны добавить
infix operator
декларации. Обратите внимание, однако, что только ограниченный набор
символы допустимы для операторов (см. Справочник По Языку - >Лексическая Структура - >Операторы для точных правил). В частности, оператор
имя должно (как уже сказал @dfri) начинаться с
/ ,=, -,+,!, *, %, , &, |, ^, ?,~, или некоторые другие символы" символа". В частности, "then" не является допустимым именем оператора.
*
уже определен, изначально, как двоичный оператор infix в Swift:
infix operator * {
associativity left
precedence 150
}
следовательно, любая функция вида func * (...
is будет перегружать этот двоичный оператор infix. С другой стороны, если вы попытаетесь использовать