Постфиксный рекурсивный пользовательский оператор в 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)£
}