if x == nil {
x = y
}
Я знаю, что приведенное выше утверждение можно переписать в виде:Сокращение для назначения, если nil в Swift?
x = x ?? y
Но x ??= y
не принимается компилятором. Есть ли сокращение, чтобы не повторять x
?
if x == nil {
x = y
}
Я знаю, что приведенное выше утверждение можно переписать в виде:Сокращение для назначения, если nil в Swift?
x = x ?? y
Но x ??= y
не принимается компилятором. Есть ли сокращение, чтобы не повторять x
?
Проверьте это, поместите следующее в глобальное пространство кода (возможно, в вашем 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)")
Надеется, что это помогает :)
Параметр 'right' не должен быть' inout'. –
Я получаю сообщение об ошибке при попытке этого на Swift 3. Невозможно преобразовать значение типа 'CGFloat' в ожидаемый тип аргумента 'inout _?' (aka 'inout Необязательный <_>') – EdwardSanchez
Вам нужно определить 'CGFloat' как' Optional', например: 'var foo: CGFloat?' – Laffen
Этот код работает в детской площадке:
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)
Вы уверены, что 'x' изменен? В моем случае 'x' остается ноль и только результат' x ?? y' является 'y'. – yzyzsun
@yzyzsun Да, конечно. Я только что исправил код и предоставил обновление. См. Это – katleta3000
Таким образом, я думаю, что вы не решили мой вопрос. – yzyzsun
Оператор ?? = был отклонен из эволюции Swift: http://article.gmane.org/gmane.comp.lang.swift.evolution/7694 – yzyzsun