2015-11-24 1 views
2

Что мне нужно - это реализовать метод делегирования для определенного NSObjectProtocol, который соответствует некоторому протоколу, но я стараюсь, не делаю это.Расширение протокола Swift2 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 { 

} 
+0

Что ошибка вы получаете? –

+0

Тип 'vc' не соответствует протоколу 'UICollectionViewDataSource' – InvokerLaw

+0

Почему бы не определить прямое расширение для 'Delegatable'? – findall

ответ

0

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

protocol SurveyDownloadHandlerDelegate { 

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


class SurveyDownloadHandler: NSObject { 

    var delegate: SurveyDownloadHandlerDelegate! = nil 
} 

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

// Класс A

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() 
    { 

    } 
} 
+0

То, что я хочу, это сделать «модуль плагина» для некоторого протокола со временем выполнения, и нет необходимости реализовывать – InvokerLaw

0

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

//: [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 
    } 
} 
+0

эй @ Гириш Колари, я был обновлено описание, PLS взять взял на него – InvokerLaw

+0

Я обновил свой ответ ... –

+0

Мне действительно нужно/* где Self: Delegatable */bcoz Мне нужно назначить делегат делегируемому объекту – InvokerLaw

 Смежные вопросы

  • Нет связанных вопросов^_^