Извините, если это глупый вопрос, но мне интересно, есть ли способ в Swift создать тип, который исключительно содержит числа, которые строго больше нуля и где «положительность» значений применяется во время компиляции.Возможно ли создать тип «Позитивный номер» в Swift?
Например, можно создать как-то написать код
func divide(x: PositiveNumber, y: PositiveNumber){
return x/y
}
таким образом, что
divide(1, 3)
работает, но
divide(1, 0)
не компилируется?
Ближе всего я мог придумать было структурой, состоящей только один ненадежного инициализаторе, что тип имеет либо положительное значение или ноль:
struct PositiveNumber {
let value: Float
init?(value: Float){
if value > 0 {
self.value = value
} else {
return nil
}
}
}
func/(left: PositiveNumber, right: PositiveNumber) -> Float {
return left.value/right.value
}
func divide(x: PositiveNumber?, y: PositiveNumber?) -> Float? {
if let x = x, y = y {
return x/y
}
return nil
}
let x1 = PositiveNumber(value: 1)
let y1 = PositiveNumber(value: 3)
let x2 = PositiveNumber(value: -1)
let y2 = PositiveNumber(value: 0)
divide(x1, y: y1)! // .333
divide(x2, y: y2)! // runtime error
Это не страшно, но мы по-прежнему приходится иметь дело с много дополнительной обработки/разворачивания. Я задаю этот вопрос, потому что у меня есть много мест в моем коде, где мне нужно проверить, что значение не равно нулю, и мне любопытно, есть ли способ удалить этот код и позволить компилятору справиться с этим. Структурное решение требует почти столько же кода.
возможно принять некоторые ответы или ответить на активные комментарии до тех пор, пока проблема не будет решена, ТНХ –
Лучший ответ ток «это невозможно», так что я держусь в надежде, что кто-то имеет " это возможно "ответ. Если никто не появится, я закрою вопрос. – rogueleaderr
Вы также понимаете, что невозможно знать любое значение, которое не является статическим до выполнения. Поэтому проверка '0' при компиляции невозможна. Тем не менее, я хотел бы видеть актуальную проблему, возможно, есть работа. –