Является ли Swift необязательной цепочкой лениво оценивается слева направо?

Документация, кажется, не упоминает ничего явного о порядке необязательной оценки цепочки, просто это:

Несколько запросов могут быть объединены в цепочку, и вся цепочка завершится неудачно, если какое-либо звено в цепочке равно нулю.

Может показаться очевидным, но мне нужно было точно подтвердить, что происходит, и подумал, что это может быть полезно для других. например, можем ли мы безопасно делать такие вещи?

    opVar?.someObject.someMethod(opVar!)

1 ответ

Решение

Дополнительные цепочки лениво оцениваются слева направо, как и следовало ожидать. Первый необязательный в цепочке сбой останавливает дальнейшую оценку цепочки.

// Playground test for left-to-right lazy evaluation.
struct C {
    static var i = 0
    func chain(count: Int) -> C? {
        print("Expected \(count) -> \(C.i)")
        assert(count == C.i)
        C.i += 1
        return C.i > 2 ? nil : self
    }
}

let c = C()
c.chain(0)?.chain(1)?.chain(2)?.chain(3)!.chain(4)!

Выход

Expected 0 -> 0
Expected 1 -> 1
Expected 2 -> 2
Другие вопросы по тегам