2015-08-13 2 views
1

У меня есть класс XMLUtil, который обертывает некоторые функции синтаксического анализа xml. Класс имеет один общий параметр T. Класс также действует как NSXMLParserDelegate для делегата NSXMLParser.Установить общий класс в качестве делегата в swift

class XMLUtil<T>: NSObject, NSXMLParserDelegate{ 
    ... 
    ... 

    init(){ 
     parser = NSXMLParser(data: NSData) 
     parser.delegate = self 
     parser.parse() 
    } 

    ... 
    ... 
    //delegate method implementations 

} 

Проблема:

Когда мой класс XMLUtil это общий класс, делегат методы не вызываются. Они, однако, когда я реализовать XMLUtil класс без общих параметров

Эти два вопроса кажутся аналогичного характера

Swift Generic class as delegate

NSURLConnection Delegate Methods Not Called In Generic Class

Есть ли что-нибудь в документации, что бы это объяснить поведение? Это намечено или это ошибка?

+0

Да, ссылки, которые вы цитируете, чтобы рассказать вам ответ. Общий класс не может быть делегатом для класса Cocoa. Это не ошибка ... это функция, которая еще не реализована. Я не знаю, будет ли это когда-либо реализовываться. Это может быть невозможно. Но это ограничение тока. –

ответ

2

Когда мой класс XMLUtil это общий класс

Но Objective-C ничего не знает общих классов. Таким образом, вы не можете показать свой класс XMLUtil для Objective-C. Таким образом, он не может служить делегатом NSXMLParser; NSXMLParser является классом Objective-C и не может видеть ваш класс XMLUtil, если он является общим.

Один простой способ увидеть это - попытаться пометить ваш класс XMLUtil как @objc. Вы потерпите неудачу; компилятор остановит вас. Невозможно показать этот класс Objective-C.

+0

Интересно. Так компилятор просто действует, как будто я не 'строка parser.delegate = self' не существует? Кроме того, почему это не мешает мне назначать общий класс как делегата класса Objective-C? – TheBaj

+0

«Кроме того, почему это не мешает мне назначать общий класс в качестве делегата класса Objective-C? Это хороший вопрос. Вы могли бы подумать, что компилятор остановит вас раньше, так или иначе. Лично я считаю это ошибкой; компилятор должен быть более полезным. Позволить вам сделать то, что на самом деле не собирается работать, не очень приятно. – matt

+0

Я считаю, что объявление отдельных методов делегатов '@ objc' не помогает? Вы не можете сказать, например. '@objc func parserDidStartDocument' и т. д. и вызвать их? Я бы не ожидал, что это сработает, но стоит попробовать. – matt

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