Необязательная привязка Swift и SKNode.name

Есть ли лучший способ написать код, в котором я получаю имя каждого SKNode, это кажется немного затянутым.

// eachChild is an SKNode
for eachChild in children {
    var theActualChildName: String
    if let childName = eachChild.name {
        theActualChildName = childName
    } else {
        theActualChildName = "Undefined"
    }
    println("NODE NAME = \(theActualChildName)")
}

Я мог бы написать (см. ниже), который работает, даже если нет имени, но если он чувствует себя плохо, так как его принудительное разворачивание необязательно.

// eachChild is an SKNode
for eachChild in children {
    println("NODE NAME = \(eachChild.name!)")
}

Я знаю, что Swift — это все о безопасности, но мне просто кажется, что я увяз в коде и задаюсь вопросом, есть ли что-то, что я упускаю?

EDIT: я заметил, что хотя SKNode.name является строкой? если вы принудительно развернете его, и он не имеет значения, он возвращает пустую строку "", я думал, что она вернет ноль.

EDIT2: Просто отметим, что ответ Антонио действительно то, что мне было нужно, но в случае SKNode.name, когда узел поступает из файла scene.SKS, кажется, что даже если имя не указано, узел по-прежнему получает имя "" (пустая строка). Если вы запустите код:

let childName = eachChild.name ?? "Undefined"

Вы либо получите данное "Name", либо "", вы никогда не получите "Undefined" Если вы установите eachChild.name = nil и запустите приведенный выше код, вы получите "Undefined" Я предполагаю, что свойство имени получает значение "" в файле *.sks, если нет другого значения указано.


person fuzzygoat    schedule 11.11.2014    source источник


Ответы (1)


Я предполагаю, что name является необязательным полем — вы можете использовать нулевой оператор объединения:

let actualChildName = eachChild.name ?? "Undefined"
person Antonio    schedule 11.11.2014
comment
Да, кажется, лучший способ. (И, например, вы можете комбинировать это с более функциональными операциями — для построения массива имен вам понадобится только одна строка: let namesArray = children.map { $0.name ?? "Undefined" }) - person Matt Gibson; 11.11.2014
comment
Да, хорошее использование map. Бесчисленное количество вещей можно делать всего тремя способами: map, filter и reduce :) - person Antonio; 11.11.2014
comment
Очень ценю Антонио, это именно то, что мне нужно. - person fuzzygoat; 11.11.2014