Как установить делегата в расширении протокола

У меня есть несколько контроллеров представления, которые показывают одинаковые ячейки. Я хочу установить делегата в расширении протокола следующим образом:

class ProductsViewController: UIViewController, ProductShowcase {
    //other properties
    @IBOutlet weak var productCollectionView: UICollectionView!
    var dataSource: DataSource!

    override func viewDidLoad() {
        super.viewDidLoad()

        setupDataSource()

        setupCollectionView()
    }

    func didSelectProduct(product: Product) {
        print(product)
    }

    //other functions
}

protocol ProductShowcase: UICollectionViewDelegate {
    var dataSource: DataSource! { get set }
    var productCollectionView: UICollectionView! { get }

    func didSelectProduct(product: Product)
}

extension ProductShowcase {
    func setupCollectionView() {
        productCollectionView.registerClass(ProductCollectionViewCell.self, forCellWithReuseIdentifier: "productCell")
        productCollectionView.dataSource = dataSource
        print(self) //prints ProductsViewController
        productCollectionView.delegate = self // 
        print(productCollectionView.delegate) //prints optional ProductsViewController
    }
}

extension ProductShowcase {
    //this delegate method is not called
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        didSelectProduct(dataSource.dataObjects[indexPath.row])
    }
}

Когда didSelectItemAtIndexPath реализуется в ProductsViewController, он вызывается. Я что-то пропустил или это неправильный подход?


person osrl    schedule 21.04.2016    source источник
comment
Я полагаю, что вы сталкиваетесь с текущим ограничением совместимости Objective-C, описанным здесь: -objc-protocol/39604189#39604189" title="метод, отличный от objc, не удовлетворяет необязательным требованиям протокола objc"> stackoverflow.com/questions/39487168/   -  person Matthew Seaman    schedule 03.11.2016


Ответы (1)


Это ограничение совместимости Objective-C. Вам не разрешено реализовывать протоколы с необязательными функциями в расширении протокола, как вы хотели (протоколы, которые относятся к делегатам управления UIKit типа Objective-C и источникам данных и т. д.). У вас может быть реализация по умолчанию только протокола, который написан так:

// No, @objc in the front of protocol. (i.e. objc-type protocol)
protocol X {
}
person Bibek    schedule 04.11.2016
comment
Помещение реализации в protocol ProductShowcase: UICollectionViewDelegate решит проблему? Где я могу прочитать об этом ограничении совместимости с Objective-C? Также обратите внимание, что в swift 3 я получаю Segmentation Fault 11 в этой строке. - person osrl; 05.11.2016
comment
Это не решит вашу проблему. Единственный способ решить вашу проблему - это подклассы. Некоторые ограничения здесь: lynda .com/Swift-tutorials/Limitations-language-interoperability/ - person Bibek; 05.11.2016