2015-12-03 3 views
5
if x == nil { 
    x = y 
} 

Я знаю, что приведенное выше утверждение можно переписать в виде:Сокращение для назначения, если nil в Swift?

x = x ?? y 

Но x ??= y не принимается компилятором. Есть ли сокращение, чтобы не повторять x?

+0

Оператор ?? = был отклонен из эволюции Swift: http://article.gmane.org/gmane.comp.lang.swift.evolution/7694 – yzyzsun

ответ

7

Проверьте это, поместите следующее в глобальное пространство кода (возможно, в вашем Extensions.swift). Это создает пользовательский оператор, который вы можете использовать в течение всего проекта.

Swift 2

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

Swift 3

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

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

var foo: String? = nil 
var bar = "Bar" 
foo ??= bar 
print("Foo: \(bar)") 

Надеется, что это помогает :)

+2

Параметр 'right' не должен быть' inout'. –

+0

Я получаю сообщение об ошибке при попытке этого на Swift 3. Невозможно преобразовать значение типа 'CGFloat' в ожидаемый тип аргумента 'inout _?' (aka 'inout Необязательный <_>') – EdwardSanchez

+0

Вам нужно определить 'CGFloat' как' Optional', например: 'var foo: CGFloat?' – Laffen

2

Этот код работает в детской площадке:

var x: Int? = nil 
let y = 5 
x = x ?? y // x becomes 5 

и

var x: Int? = 6 
let y = 5 
x = x ?? y // x stays 6 

Кстати вот некоторые варианты проверки нолю:

if x != nil { 
    // classic 
} 

if x != .None { 
    // nil in Swift is enum with value .None 
} 

if let _x = x { 
    // if you need it's value 
} 
if let _ = x { 
    // if you don't need it's value 
} 

UPD: код для проекта - копировать и запускать его:

var x: Int? = nil 
let y = 5 
x = x ?? y 
print (x) 
x = 7 
x = x ?? y 
print (x) 
+0

Вы уверены, что 'x' изменен? В моем случае 'x' остается ноль и только результат' x ?? y' является 'y'. – yzyzsun

+0

@yzyzsun Да, конечно. Я только что исправил код и предоставил обновление. См. Это – katleta3000

+0

Таким образом, я думаю, что вы не решили мой вопрос. – yzyzsun