2015-08-27 6 views
0

Я читаю xml из веб-службы. Я могу успешно отобразить xml с помощью println. Теперь я пытаюсь принять xml-ответ и проанализировать отдельные элементы, используя NSXMLParse. Это мой код:Swift - Невозможно присвоить значение типа «AEWebServices.Type» значению типа NSXMLParserDelegate?

public class AEWebServices : NSObject, NSXMLParserDelegate 
{ 
    var posts = NSMutableArray() 
    var elements = NSMutableDictionary() 
    var element = NSString() 
    var nextItem = AEItem() 

    var mutableData:NSMutableData = NSMutableData.alloc() 
    var currentElementName:NSString = "" 
    var foundCharacters = "" 
    var appParsedData = [Dictionary<String, String>]() 
    var currentDataDictionary = Dictionary<String, String>() 

    public class func performSearch(searchTerm : String, webService : String, resultsType : String) -> Bool{ 
     var serviceSuccess = false 

     SRWebClient.GET(AEState.baseUrl + webService+"AccessKey="+AEState.accessKey+"&SearchTerm=" + searchTerm, 
      success:{(response:AnyObject!, status:Int) -> Void in 
       //this is success part 
       println("connection success - search successful") 
       println(response) 
       serviceSuccess=true 
       let resultsData = response.dataUsingEncoding(NSUTF8StringEncoding) 
       var xmlparser = NSXMLParser(data: resultsData!) 
       xmlparser.delegate = self 
       xmlparser.parse() 
       println("just after xml statement") 
       //self.performSegueWithIdentifier("showResults", sender: self) 
      }, failure:{(error:NSError!) -> Void in 
       //this is failure part 
       println("connection failed - search failed") 
       println(error) 
     }) 
     return serviceSuccess 
    } 

    public func parser(parser: NSXMLParser, 
     didStartElement elementName: String, 
     namespaceURI: String!, 
     qualifiedName qualifiedName: String?, 
     attributes attributeDict: [NSObject : AnyObject]) { 
      println("in parser") 
      println(elementName) // This line is never executed. 
    } 


    public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     println("in parser 2") 
     if !foundCharacters.isEmpty { 
      currentDataDictionary[currentElementName as String] = foundCharacters 
      foundCharacters = "" 

      //Last Element so add to main Dictionary 
      //Cannot find last element yet on XML so use Charge_GBP for testing until fixed 
      if currentElementName == "Charge_GBP" { 
       appParsedData.append(currentDataDictionary) 
      } 
     } 
    } 

    public func parser(parser: NSXMLParser, foundCharacters string: String?) { 
     println("in parser 3") 
     if (currentElementName == "Entry_ID") || (currentElementName == "Title") || currentElementName == "Description" || currentElementName == "Charge_USD" || currentElementName == "Charge_GBP" || currentElementName == "Classification_Type" { 
      foundCharacters += string! 
     } 
    } 

    public func parserDidEndDocument(parser: NSXMLParser) { 
     println("in parser 4") 
     // self.setupItemsOnView() 

    } 
} 

Мой код стремится создать класс, который будет подключаться к веб-службе, и, в случае успеха, будет получать итоговую информацию о XML и анализировать ее с помощью NSXMLParser. Я реализации NSXMLParserDelegate, но эта строка кода вызывает у меня проблема:

xmlparser.delegate = самостоятельная

Ошибки я получаю: Невозможно присвоить значение типа «AEWebServices.Type» до значения типа NSXMLParserDelegate?

Я новичок в Swift, так что простите меня, если мне не хватает чего-то очевидного :-) Помогите оценить.

+1

Вы, скорее всего, нужно будет объявить 'вар xmlparser = NSXMLParser() xmlparser.delegate = self' за пределами вашего закрытия, так как в противном случае он недоступен, а затем найдите способ передачи данных на него. –

+0

Спасибо за помощь, Клаус - это решило мою проблему, которую я опубликовал в качестве ответа ниже. Если вы добавите свой комментарий в качестве ответа, я соглашусь с ним :-) – JanB

ответ

0

Принимая советы Клауса Йоргенсен, принял декларацию вне замыкания, чтобы дать этому, которая компилирует и работает:

уаг XmlParser: NSXMLParser!

общественного функ performSearch (SEARCHTERM: String, WebService: String, resultsType: String) -> Bool { вар serviceSuccess = ложь

SRWebClient.GET(AEState.baseUrl + webService+"AccessKey="+AEState.accessKey+"&SearchTerm=" + searchTerm, 
    success:{(response:AnyObject!, status:Int) -> Void in 
     //this is success part 
     println("connection success - search successful") 
     println(response) 
     serviceSuccess=true 
     var resultsData = response.dataUsingEncoding(NSUTF8StringEncoding) 

     self.xmlParser = NSXMLParser(data: resultsData!) 
     self.xmlParser.delegate = self 
     self.xmlParser.parse() 

     println("just after xml statement") 
     //self.performSegueWithIdentifier("showResults", sender: self) 
    }, failure:{(error:NSError!) -> Void in 
     //this is failure part 
     println("connection failed - search failed") 
     println(error) 
}) 
return serviceSuccess 

}

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