Расширение протокола Swift2 NSObjectProtocol

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

Демо ниже

Обновите для более точного

=========================================================================

У меня есть один протокол PagedLoadable для получения информации о том, что нужно collectionView, затем extension NSObjectProtocol where Self: Delegatable, автоматическая настройка для реализации объекта PagedLoadable

protocol PagedLoadable {
    var count: Int { get }

}

protocol Delegatable: UICollectionViewDelegate, UICollectionViewDataSource {


}

extension PagedLoadable where Self: Delegatable {
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return  count
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = UICollectionViewCell()
        return cell
    }
}

class vc: UIViewController {

}

extension vc: PagedLoadable {
    var count: Int {
        return 1
    }
}

extension vc: Delegatable {

}

person InvokerLaw    schedule 24.11.2015    source источник
comment
Какую ошибку вы получаете?   -  person Girish Kolari    schedule 24.11.2015
comment
Тип «vc» не соответствует протоколу «UICollectionViewDataSource».   -  person InvokerLaw    schedule 24.11.2015
comment
Почему бы не определить прямое расширение для Delegatable?   -  person findall    schedule 24.11.2015
comment
@findall Не могли бы вы показать мне? Т_Т   -  person InvokerLaw    schedule 24.11.2015
comment
@InvokerLaw Извините, что я проверил то, что сказал, но компилятор рухнул из-за segfault, хотя он был пройден. (Я пытался extension Delegatable { /* Implementations required by UICollectionViewDataSource */ })   -  person findall    schedule 24.11.2015


Ответы (2)


Создайте протокол
//Класс SurveyDownloadHandler

protocol SurveyDownloadHandlerDelegate {

     func surveyDownloadSuccessfully(notiExpireRemainingTime : Int)
     func surveyDownloadConnectionFail()
}


class SurveyDownloadHandler: NSObject  {

    var delegate: SurveyDownloadHandlerDelegate! =  nil
}

//для вызова метода обратно в класс A delegate.surveyDownloadSuccessfully(notiExpireRemainingTime)

// Класс А

class A : UIViewController,SurveyDownloadHandlerDelegate{

   let surveyDownloadHandlerObject : SurveyDownloadHandler = SurveyDownloadHandler()

   @IBAction func onTapClick(sender: AnyObject) {

          self.surveyDownloadHandlerObject.delegate = self
          self.surveyDownloadHandlerObject.startDownloadingSurvey()
     }
  }

   func surveyDownloadSuccessfully(notiExpireRemainingTime : Int)
   {
   }
   func surveyDownloadConnectionFail()
   {

  }
}
person Saumil Shah    schedule 24.11.2015
comment
Я хочу сделать подключаемый модуль для некоторого протокола со временем выполнения, и мне не нужно реализовывать - person InvokerLaw; 24.11.2015

Вы пытаетесь реализовать расширение протокола, за исключением наследования. После некоторого эксперимента я мог бы удалить вашу ошибку следующим образом.

    //: [Next](@next)
    protocol PagedLoadable {
        var count: Int { get }
    }

    protocol Delegatable: UICollectionViewDelegate, UICollectionViewDataSource {

    }
    extension Delegatable {

    }
//Removed since code will not be able to resolve dependency 
    extension PagedLoadable /*where Self: Delegatable*/ {

        func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
            return  count
        }

        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 1
        }

        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            let cell = UICollectionViewCell()
            return cell
        }
    }

//Один из способов

    class vc: UIViewController,PagedLoadable, Delegatable {
        var count: Int {
            return 1
        }

    }

//или можно сделать и так

extension vc: PagedLoadable, Delegatable {
    var count: Int {
        return 1
    }
}
person Girish Kolari    schedule 24.11.2015
comment
эй @Girish Kolari, я обновил описание, пожалуйста, взгляните на него - person InvokerLaw; 24.11.2015
comment
Мне нужно было /*where Self: Delegatable*/, потому что мне нужно установить делегата на делегируемый объект - person InvokerLaw; 24.11.2015
comment
Вы можете сделать, где Self: Delectable, если это чистый быстрый объект без ссылки на время выполнения Objective C. - person Girish Kolari; 24.11.2015
comment
Просто стало любопытно - в вашем объекте кода vc есть его объект делегата - в чем ошибка, которую вы должны установить как объект делегата - person Girish Kolari; 24.11.2015