2015-06-20 2 views
1

Я хочу использовать короткую форму закрытия {$0 > 1} в вызовах NSIndexSet класса:Как правильно использовать короткие Swift замыкания в вызовах классов ObjC

let indexSet: NSIndexSet = getSomeIndexSet() 
let filteredIndexSet = indexSet.indexesPassingTest(){$0 > 1} 

, но это дает мне

не может ссылаться на ' indexesPassingTest»со списком аргументов типа '((_) -> _)'

, но это работает: indexSet.indexesPassingTest(){(i,s) in i > 1} хотя типа на mes все еще не существует.

Это ошибка или я что-то упускаю?

ответ

5

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

Основываясь на комментарии Мартина R, похоже, что закрытие должно соответствовать двум аргументам. Таким образом, можно использовать $ 0 или $ 1, или если используется только один, то $ 0 становится кортежем.

let filteredIndexSet = indexSet.indexesPassingTest { $0.0 > 20 } 

The $ 0,0 означает первый элемент кортежа, который является индексом.

+0

Вау! Благодаря! Никогда бы не подумал об этом! И в чем отличие от Array.reduce закрыть комбинацию? –

+3

Вы можете * либо * использовать '$ 0' ** и **' $ 1' (в этом случае '$ 0' является индексом, а' $ 1' является логическим указателем) * или * просто '$ 0' (который затем является кортежем состоящий из индекса и указателя). Сравните https://devforums.apple.com/message/1117149#1117149. «Проблема» заключается в том, что вы не можете «пропустить» неиспользуемые сокращенные аргументы. –

+0

@ Алексей Мартемьянов: Нет никакой разницы. –

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