2016-11-20 4 views
3

私のアプリをSwift 3に翻訳しています。UICollectionViewのデータソースと代理を設定するクリーンな方法UITableViewCellの内部には、hereと記載されています。次のようにSwift 3ジェネリック:UICollectionViewDatasourceとUITableViewCell内のUICollectionViewの代理人を設定する際の問題

コードは次のとおりです。

func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>> 
(_ dataSourceDelegate: D, forRow row: Int) { 

collectionView.delegate = dataSourceDelegate 
collectionView.dataSource = dataSourceDelegate 
collectionView.tag = row 
collectionView.reloadData()} 

をそして、それは述べ、警告がスローされます:私は提案された解決策を受け入れた場合

'protocol<...>' composition syntax is deprecated; join the protocols using '&'

が、それはD: (UICollectionViewDatasource & UICollectionViewDelegate)呼び出しにD: protocol<UICollectionViewDataSource, UICollectionViewDelegate>を変更し、代わりにエラーをスローする:

Expected a type name or protocol composition restricting 'D'

私は多くのob自分よりもSwift 3ジェネリックをよりよく理解している人が解決策を提案できれば結構です。

答えて

6

protocol<>を使用する必要はありません。コンパイラはすでにそれを知っているからです。 Xcodeのは、修正プログラムは、単に彼らが問題を修正、削除、括弧でスロー提案理由D: UITableViewDelegate & UITableViewDataSource

+2

なしアイデア:ちょうどこのようなプロトコルに参加。どうもありがとう! – michalronin

1

setCollectionViewDataSourceDelegateswift3

extension PollTableViewCell { 

     func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>(_ dataSourceDelegate: D, forRow row: Int) { 

     theCollectionView.delegate = dataSourceDelegate 
     theCollectionView.dataSource = dataSourceDelegate 
     theCollectionView.tag = row 
     theCollectionView.setContentOffset(theCollectionView.contentOffset, animated:false) // Stops collection view if it was scrolling. 
     theCollectionView.reloadData() 
    } 

    var collectionViewOffset: CGFloat { 
     set { 
      theCollectionView.contentOffset.x = newValue 
     } 

     get { 
      return theCollectionView.contentOffset.x 
     } 
    } 
} 
関連する問題