Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios XML解析器出现Swift错误,无法转换RSSItem类型的值?_Ios_Swift_Xml_Xcode_Xml Parsing - Fatal编程技术网

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

Ios XML解析器出现Swift错误,无法转换RSSItem类型的值?,ios,swift,xml,xcode,xml-parsing,Ios,Swift,Xml,Xcode,Xml Parsing,我一直在学习一个关于在Swift中创建XML解析器的老教程,该教程位于。其中,对于完成处理程序,他有: func parserDidEndDocument(_ parser: XMLParser) { parserCompletionHandler?(rssItems) } 问题是它在RSSItem上抛出了一个错误,并说:无法将类型为“[RSSItem]”的值转换为预期的参数类型“RSSItem” 自本教程以来,Swift发生了怎样的变化,我如何才能使其正常工作?下面是

我一直在学习一个关于在Swift中创建XML解析器的老教程,该教程位于。其中,对于完成处理程序,他有:

func parserDidEndDocument(_ parser: XMLParser) {
        parserCompletionHandler?(rssItems)
    }
问题是它在RSSItem上抛出了一个错误,并说:
无法将类型为“[RSSItem]”的值转换为预期的参数类型“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)
    }
}

parserCompletionHandler:((RSSItem)->Void)
,它需要一个
RSSItem
的实例。您有
parserCompletionHandler?(rssItems)
,您有
var rssItems:[RSSItem]
,它是
RSSItem
的一个实例数组,请参见问题?它期待“一”,你给他一个列表(即使列表中只有一项,它也是一个列表)