Есть ли у Swift функция "or equals", как | / = в Ruby?


В Swift, как я могу установить необязательный foo, но только если это nil?

Я знаю о нулевом коалесцирующем операторе Свифта :

foo = foo ?? "Hello" (где foo - необязательный String)

Но есть ли лучший способ, как в Ruby?

foo ||= "Hello"

3 3

3 ответа:

Такой оператор был рассмотрен и отклонен: https://github.com/apple/swift-evolution/blob/master/proposals/0024-optional-value-setter.md

Рациональная причина отказа должна быть в списке электронной почты swift-evolution, но ссылка, прикрепленная к вышеуказанным пунктам, указывает на SE-0025 вместо 24.

Вот ссылка на rational (отредактирована из-за комментария Кеннета Бруно): http://article.gmane.org/gmane.comp.lang.swift.evolution/7694

Нет, именно так и надо делать. Если вы хотите, вы можете завернуть его в свой собственный оператор:

infix operator ||= {}
func ||=<T>(inout left: Optional<T>, right: T) { left = left ?? right }

var foo:String? = nil // foo -> nil
foo ||= "Hello"       // foo -> "Hello"
foo ||= "Hi"          // foo -> "Hello"

Я бы рекомендовал использовать ??=, чтобы соответствовать шаблону foo = foo ?? "Hello", но использовать все, что вам удобно.

Для типов Bool в Swift 3:

infix operator ||=
func ||=(lhs: inout Bool, rhs: Bool) { lhs = (lhs || rhs) }

Использование:

var bool = false
bool ||= false // false
bool ||= true // true
bool ||= false // true