2016-11-20 1 views
3

내 응용 프로그램을 Swift 3으로 변환하는 중입니다. UICollectionView에 대한 데이터 소스 및 위임을 설정하는 방법을 사용하여 문제가 발생했습니다. UITableViewCell 내부에 here을 설명합니다. 다음과 같이스위프트 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>을 변경하고 대신 오류가 throw됩니다.

Expected a type name or protocol composition restricting 'D'

내 자신보다 스위프트 3 제네릭에 대한 더 나은 이해를 가진 누군가가 해결책을 제시 할 수 있다면 연결시켜야합니다.

답변

6

컴파일러가 이미 알고 있기 때문에 protocol<>을 사용할 필요가 없습니다. 다만이 같은 프로토콜을 가입 : 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 
     } 
    } 
}