Тип выражения '(_) - ›_' неоднозначен без дополнительного контекста

получение ошибки при обновлении с swift 3 до swift 4. ошибка возникает при использовании метода UICollection performBatchUpdates (). Мой код выглядит примерно так:

Class A: UICollectionViewDelegate {
    @IBOutlet weak var collectionView: UICollectionView!

    func someMethod() {
         collectionView?.performBatchUpdates({ [weak self] _ in // error:  Expression type '(_) -> _' is ambiguous without more context
             self?.collectionView?.deleteItems(at: [IndexPath(item: 0, section: 0)])
            }, completion: nil)
         })
    }
} 

person Roshan Chamlagain    schedule 23.09.2019    source источник
comment
Удалите подчеркивание _ in на in   -  person King    schedule 23.09.2019


Ответы (3)


_ in означает:

  1. Подтверждение существования переменной, переданной вам в в закрытие.
  2. Однако вы хотите игнорировать эту переменную, т.е. не выделять память. Вы игнорируете это, не давая имени переменной. См. Что означает знак подчеркивания _ в Swift References?.

Если переменная не передается из performBatchUpdates, это подтверждение становится ненужным и неправильным. Значит вам нужно удалить _. Но все же оставьте in, потому что вам нужно передать в weak ссылку на self, чтобы избежать проблем с памятью.

person Honey    schedule 23.09.2019

удалить "_" в

//...
collectionView?.performBatchUpdates({ [weak self] _ in
//...

сделай это

//...
collectionView?.performBatchUpdates({ [weak self] in
//...
person Durdu    schedule 23.09.2019

Весь ваш код не будет компилироваться, поскольку у класса должен быть NSObject потомок, вдобавок performBatchUpdates не имеет переменных в его завершении, поэтому этот _ следует удалить

class A : UIViewController,UICollectionViewDelegate {

        @IBOutlet weak var collectionView: UICollectionView!

        func someMethod() {
            collectionView?.performBatchUpdates({ [weak self]  in
                self?.collectionView?.deleteItems(at: [IndexPath(item: 0, section: 0)])
          })
        }
}
person Sh_Khan    schedule 23.09.2019