2016-07-02 2 views
4

Если я хочу рассчитать, если все Bool s в списке: true с этим фрагментом, почему типы не будут правильно выведены?Неоднозначная ссылка на member &&

let bools = [false, true, false, true] 
let result = bools.reduce(true, combine: &&) 
+0

Предлагаю вам посмотреть [здесь] (http://stackoverflow.com/a/34699637/5654848). Это объясняется подробно. – Dershowitz123

+1

Вы можете просто написать это как 'let result =! Bools.contains (false)', который будет компилироваться с двусмысленностью btw :) Но определенно интересуется именно тем, почему это неоднозначно. – Hamish

ответ

1

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

let result = bools.reduce(true, combine: { $0 && $1 }) 

или

let result = bools.reduce(true) { $0 && $1 } 

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

let result = !bools.contains(false) 

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

Смежные вопросы