2016-05-04 6 views
2

Для моих параметров по умолчанию я должен написатьпараметры по умолчанию быстры

func myFunc(optionA: Int? = 0) 

или

func myFunc(optionA: Int! = 0) 

Что является более целесообразным и/или, что более важно, который используется больше в производстве? Что произойдет, если я использую Int! вместо Int?? Могу ли я передать либо Int, nil, либо без параметра, не требуя развернуть параметр при доступе? Рассматривает ли это ленивое программирование и может представлять потенциальную неуверенность в памяти?

+3

0 не ноль. Неясно, каков ваш вопрос. Что вы ожидаете от случая с «Int!»? Почему это не просто «Int», если у него есть значение по умолчанию? –

+0

@RobNapier То, что я хочу достичь, состоит в том, что если я не поставлю значение, или параметр «nil» предоставляется для параметра, его значение по умолчанию равно 0. Я отредактировал мой вопрос, чтобы улучшить его ясность. –

+3

Если это зависит от контекста. Но в большинстве случаев лучший выбор для параметра «Int» не является необязательным. – vadian

ответ

4

0 Не ноль. В любом случае вы делаете optionA имеют значение 0, а не nil.

Правильный ответ здесь зависит от того, какой интерфейс вы хотите, чтобы ваша функция имела.

  • Если вы хотите звонящие, чтобы иметь возможность пройти Int, nil или нет параметра вообще, то optionA должен быть Int? типа.
  • Если вы хотите, чтобы вызывающие абоненты могли передать Int, никакого параметра не было, но НЕ nil, то optionA должен быть Int.
+0

Что произойдет, если вместо этого я использую 'Int !'? Могу ли я достичь этой функциональности, пока вам не нужно разворачивать параметр при доступе? Рассматривает ли это ленивое программирование и создает потенциальную неуверенность в памяти? –

+2

Я не рядом с моим Mac, чтобы проверить это, но если я правильно напомню: тип 'Int' предотвратит передачу 'nil' (через ошибку типа компилятора), тип' 'Int' 'позволит' nil', но потребуется ручное разворачивание, а 'Int!' позволит пропускать 'nil', но приведет к взрыву юниверса. – Alexander

+2

Чтобы ответить на ваш последний вопрос: Да, злоупотребление оператором развертывания силы считается ленивым и в значительной степени является первым примером плохой практики Свифта, о которой упоминает каждый. Память по-прежнему безопасна, так как принудительное развертывание опциона «nil» необязательно будет вызывать ошибку времени выполнения (предотвращение возможных операций с опасной памятью) – Alexander

2

, если я не обеспечиваете значение или ноль подается для параметра его значение по умолчанию становится 0.

Это очень странное требование, и, вероятно, указывает на ошибку проектирования. Однако это тривиально реализовать.

func myFunc(optionA: Int? = nil) { 
    let a = optionA ?? 0 
    // ...continue to use a... 
} 

Это, скорее всего, сломанный API. Было бы полезно дать более конкретный пример того, какую проблему вы решаете, которая не решена только func myFunc(a: Int) (что должно быть вашим сильным предпочтением, если у вас нет веской причины для чего-то еще).

Смежные вопросы