Какой тип логических операторов?

Я хочу использовать их в качестве параметра для метода моей структуры Region:

private func combineWith(region: RegionProtocol, combine: (Bool, Bool) -> Bool) -> Region {
    return Region() {point in
        combine(self.contains(point), region.contains(point))
    }
}

Но, видимо, (Bool, Bool) -> Bool) это не то, что && или || являются. Если вы знаете, пожалуйста, дайте мне знать, как вы узнали.

1 ответ

Решение

Если вы "cmd-click" на слово "Swift" в заявлении

import Swift

в Xcode и искать || тогда вы обнаружите, что он объявлен как

func ||<T : BooleanType>(lhs: T, rhs: @autoclosure () -> Bool) -> Bool

Причина заключается в "коротком замыкании" поведения || Оператор: если первый операнд имеет значение true, то второй операнд не должен оцениваться вообще.

Таким образом, вы должны объявить параметр как

combine: (Bool, @autoclosure () -> Bool) -> Bool

Пример:

func combineWith(a : Bool, b : Bool, combine: (Bool, @autoclosure () -> Bool) -> Bool) -> Bool {
    return combine(a, b)
}

let result = combineWith(false, true, ||)
println(result)

Примечание: я проверил это с Xcode 6.1.1. Синтаксис параметров автозаполнения изменился в Swift 1.2 (Xcode 6.3), и я пока не смог перевести вышеуказанный код для Swift 1.2 (см. Также комментарии Роба ниже).

Единственное, что я могу предложить на данный момент, - это крайне уродливые обходные пути. Вы могли бы обернуть || в замыкание, которое не имеет параметров автозаполнения:

func combineWith(a : Bool, b : Bool, combine: (Bool, () -> Bool) -> Bool) -> Bool {
    return combine(a, { b })
}

let result = combineWith(false, true, { $0 || $1() } )

Или вы идете без короткого замыкания

func combineWith(a : Bool, b : Bool, combine: (Bool, Bool) -> Bool) -> Bool {
    return combine(a, b)
}

let result = combineWith(false, true, { $0 || $1 } )
Другие вопросы по тегам