【问题标题】:postfix recursive custom operator in swiftswift中的后缀递归自定义运算符
【发布时间】:2015-08-29 18:37:46
【问题描述】:

我正在尝试声明一个自定义后缀运算符来计算给定数字的阶乘,有没有办法使这个函数递归(数字-1)!!?

postfix operator !! {}
postfix func !! (number: Double) -> Double {

    if (number <= 1) { return 1.0 }
    return number * (number-1)!!

}

【问题讨论】:

    标签: ios swift operator-overloading


    【解决方案1】:

    我认为这是不可能的,因为它与用于解包选项的 ! 冲突。

    来自The Swift Programming Language: Keywords and Puncutation

    以下标记保留为标点符号,不能用作自定义运算符:(){}[].、@987654331 @、:;=@#&amp;(作为前缀运算符)、-&gt;`?!(作为后缀运算符)

    但是,在我看来,如果是这种情况,那么postfix operator !! {} 是有效的就是一个错误。我推荐filing a bug

    例如,您可以使用 来解决此问题(双感叹号;U+203C)。

    【讨论】:

    • 我已经把它报告给苹果了,顺便谢谢你的详细回答+1:D
    【解决方案2】:

    这是可行的,但如果你使用!! 则不行——它会将其解释为两个隐式的可选尊重。其他一些符号也可以使用 - 例如:

    postfix operator £ {}
    postfix func £(number : Double) -> Double {
      if number<=1 {
        return 1.0
      }
      return number * (number-1)£
    }
    

    【讨论】:

    • 您是否知道为什么这样做有效,但不允许使用欧元?我得到“'€' 被认为是一个标识符,而不是一个运算符”。
    【解决方案3】:

    我们需要在文件级别指定后缀运算符:

    import UIKit
    
    postfix operator !
    struct A {
        var a = 5
        var b = 10
    
    }
    
    extension A {
    
        static postfix func !(m: A) -> A {
            return A(a: -m.a, b: -m.b)
        }
    
    }
    
    var obj1 = A(a:45, b: 46)
    var obj4 = obj1!
    

    现在,obj4 的值将是 -45、-46

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多