Ленивая оценка Xcode 10.2+ - PullRequest
3 голосов
/ 26 апреля 2019

Я заметил другое поведение в ленивой оценке с Xcode 10.2 +.

Если у меня есть текущий код:

class C {

    private let myString: String?
    private let tag: Int

    init(string: String?, tag: Int) {
        myString = string
        self.tag = tag
    }

    func f() -> String? {
        print("\(tag) called")
        return myString
    }
}

let a = C(string: nil, tag: 0)
let b = C(string: "2", tag: 1)
let c = C(string: nil, tag: 2)

let array = [a, b, c]

let string = array.lazy.compactMap { $0.f() }.first

Я бы ожидал вывод:

0 called
1 called

(который у меня есть с Xcode 10.1)

но это на самом деле:

0 called
1 called
1 called // called twice

Я бы не сказал, что это проблема со Swift 5, потому что мой проект все еще использует Swift 4.0

...