代码之家  ›  专栏  ›  技术社区  ›  Ky -

如何编写Swift中缀函数?

  •  10
  • Ky -  · 技术社区  · 8 年前

    我已经看到了这一点,但我就是无法接受。不知怎的,看似神奇的是,一些中缀函数运行良好,但其他函数根本无法编译。例如:

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

    正如你在这里看到的,我的 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 回复  |  直到 8 年前
        1
  •  10
  •   Martin R    8 年前

    Swift标准库已经定义了 * 作为中缀运算符:

    infix operator * {
        associativity left
        precedence 150
    }
    

    您可以在 Swift Standard Library Operators Reference 。或者,在 import Swift 语句,并搜索“operator”。

    要在“传统”函数调用中使用运算符,必须将其括在括号中:

    (*)("Left", 6)
    

    如果你想定义你自己的中缀操作符,你必须添加一个 infix operator 公告然而,请注意 字符对运算符有效(请参见 Language Reference->Lexical Structure->Operators 精确规则)。特别是,操作员 name必须(正如@dfri已经说过的)以 /, =, -, +, !, *, %, <>&,|,^,?,~,或其他一些“符号”字符。特别是,“then”不是有效的运算符名称。

        2
  •  3
  •   dfrib    8 年前

    * 已经在Swift中本地定义为二进制中缀运算符:

    infix operator * {
        associativity left
        precedence 150
    }
    

    因此,表单的任何功能 func * (... is将重载此二进制中缀运算符。另一方面,如果您试图使用 * 操作员作为 前缀一元 操作员,您将得到描述错误 " * 不是前缀一元运算符“ ,只是因为 * 不作为前缀运算符本机存在。

    你当然可以自己定义 前缀 操作人员 * :

    prefix operator * { }
    prefix func * (rhs: Int) -> Int {
        return rhs*rhs
    }
    
    var a : Int = 2
    var b : Int = *a // 4
    

    总结一下:有些运算符在Swift中以前缀和中缀运算符的形式存在,例如。 -

    /* Declared natively in Swift */
    infix operator - {
        associativity left
        precedence 140
    }
    
    prefix operator - {
    }
    
    /* Example usage */
    let a : Int = 2 - 1 // 1,  '-' infix operator used
    let b : Int = -1    // -1, '-' prefix operator used
    

    而其他的,例如 * ,只是(本机)用作中缀运算符。

    还请注意,如果要定义自己的自定义中缀运算符,其允许的名称将受到如下限制:

    自定义运算符可以以ASCII字符/、=、-、, +, !, *, %, <>&,|,^?,或~,或以下语法中定义的Unicode字符之一(包括 数学运算符、其他符号和Dingbats Unicode 块等)。在第一个字符之后,组合Unicode 也允许字符。

    从…起 Language Reference - Lexical Structure .