代码之家  ›  专栏  ›  技术社区  ›  user717452

XML解析器出现Swift错误,无法转换RSSItem类型的值?

  •  0
  • user717452  · 技术社区  · 4 年前

    我一直在学习一个关于在Swift中创建XML解析器的老教程 https://www.youtube.com/watch?v=fP69LI5bZlg . 其中,对于完成处理程序,他有:

    func parserDidEndDocument(_ parser: XMLParser) {
            parserCompletionHandler?(rssItems)
        }
    

    问题是它在rssItems上抛出了一个错误并说: Cannot convert value of type '[RSSItem]' to expected argument type 'RSSItem'

    自本教程以来,Swift发生了怎样的变化,我怎样才能让它正常工作?下面是我的全部代码,以提供上下文。

    struct RSSItem {
        var title: String
        var description: String
        var link: String
        var pubDate: String
    }
    
    // download xml from the internet
    
    class FeedParser: NSObject, XMLParserDelegate
    {
        private var rssItems: [RSSItem] = []
        private var currentElement = ""
        private var currentTitle: String = ""
        private var currentDescription: String = ""
        private var currentPubDate: String = ""
        private var currentLink: String = ""
        private var parserCompletionHandler: ((RSSItem) -> Void)?
        
        func parseFeed(url: String, completionHandler: ((RSSItem) -> Void)?)
        {
            self.parserCompletionHandler = completionHandler
            let request = URLRequest(url: URL(string: url)!)
            let urlSession = URLSession.shared
            let task = urlSession.dataTask(with: request) { (data, response, error) in
                guard let data = data else {
                    if let error = error {
                        print(error.localizedDescription)
                    }
                    return
                }
                let parser = XMLParser(data: data)
                parser.delegate = self
                parser.parse()
                
            }
            
            task.resume()
        }
        func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
            if currentElement == "item" {
                currentTitle = ""
                currentDescription = ""
                currentPubDate = ""
                currentLink = ""
            }
        }
        func parser(_ parser: XMLParser, foundCharacters string: String) {
            switch currentElement {
            case "title": currentTitle += string
            case "description": currentDescription += string
            case "pubDate" : currentPubDate += string
            case "link" : currentLink += string
            default: break
            }
        }
        func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
            if elementName == "item" {
                let rssItem = RSSItem(title: currentTitle, description: currentDescription, link: currentLink, pubDate: currentPubDate)
                self.rssItems.append(rssItem)
            }
        }
        func parserDidEndDocument(_ parser: XMLParser) {
            parserCompletionHandler?(rssItems)
        }
        func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
            print(parseError.localizedDescription)
        }
    }
    
    0 回复  |  直到 4 年前