Как написать функции Swift infix?

Я видел, как это делается,но я просто не могу понять это. Как-то, казалось бы, волшебно, некоторые функции infix работают нормально, но другие просто не компилируются. Например:

A function named "*" works fine, but one named "then" does not.

как вы видите здесь, мой 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. С другой стороны, если вы попытаетесь использовать