Какой тип логических операторов?
Я хочу использовать их в качестве параметра для метода моей структуры 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 } )