Постфиксный рекурсивный пользовательский оператор в swift

Я пытаюсь объявить пользовательский постфиксный оператор, который вычисляет факториал заданного числа, есть ли способ сделать эту функцию рекурсивной (число-1)!!?

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

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

}

2 ответа

Я считаю, что это невозможно просто потому, что это противоречит ! который используется для распаковки опций.

Из языка программирования Swift: ключевые слова и пунктуация

Следующие токены зарезервированы как знаки пунктуации и не могут использоваться в качестве пользовательских операторов: (, ), {, }, [, ], ., ,, :, ;, =, @, #, & (в качестве префиксного оператора), ->, `, ? и ! (как постфиксный оператор).

Однако, по моему мнению, если это так, то это ошибка, которая postfix operator !! {} является действительным. Я бы порекомендовал подать ошибку.

Вы можете обойти это с помощью например (двойной восклицательный знак; U+203C).

Нам нужно указать постфиксный оператор на уровне файла:

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.

Это выполнимо, но не если вы используете !!- он интерпретирует это как две неявные необязательные привязки. Будет работать другой символ, например:

postfix operator £ {}
postfix func £(number : Double) -> Double {
  if number<=1 {
    return 1.0
  }
  return number * (number-1)£
}
Другие вопросы по тегам