Parsing swift中的alloc()错误
因此,我刚刚将swift更新为2.0,显然代码中出现了一些错误。 这就是我现在拥有的Parsing swift中的alloc()错误,parsing,rss,swift2,alloc,Parsing,Rss,Swift2,Alloc,因此,我刚刚将swift更新为2.0,显然代码中出现了一些错误。 这就是我现在拥有的 unc loadRssFeed(data: NSURL) { var myRssParser : ParserManager = ParserManager.alloc().initWithURL(data) as! ParserManager myRssFeed = myRssParser.feeds tableView.reloadData() } Fixit建议将“var”
unc loadRssFeed(data: NSURL) {
var myRssParser : ParserManager = ParserManager.alloc().initWithURL(data) as! ParserManager
myRssFeed = myRssParser.feeds
tableView.reloadData()
}
Fixit建议将“var”更改为“let”,并使用对象初始值设定项而不是alloc()。但问题是,我以前从未使用过它(当然,我的快速体验就像四个星期)
我是否应该遵循fixit说明?
如何解决alloc()问题
谢谢
更新的wit解析器代码:
class ParserManager: NSObject, NSXMLParserDelegate {
var parser = NSXMLParser()
var feeds = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var ftitle = NSMutableString()
var link = NSMutableString()
var fdescription = NSMutableString()
var fdate = NSMutableString()
func initWithURL(url :NSURL) -> AnyObject {
startParse(url)
return self
}
func startParse(url :NSURL) {
feeds = []
parser = NSXMLParser(contentsOfURL: url)!
parser.delegate = self
parser.shouldProcessNamespaces = false
parser.shouldReportNamespacePrefixes = false
parser.shouldResolveExternalEntities = false
parser.parse()
}
func allFeeds() -> NSMutableArray {
return feeds
}
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
self.element = elementName
if self.element == "item" {
self.ftitle = ""
self.fdescription = ""
self.fdate = ""
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString).isEqualToString("item") {
if ftitle != "" {
elements.setObject(ftitle, forKey: "title")
}
if fdescription != "" {
elements.setObject(fdescription, forKey: "description")
}
if fdate != "" {
elements.setObject(fdate, forKey: "pubDate")
}
feeds.addObject(elements)
}
}
func parser(parser: NSXMLParser, foundCharacters string: String?) {
if element.isEqualToString("title") {
ftitle.appendString(string!)
}else if element.isEqualToString("description") {
fdescription.appendString(string!)
}else if element.isEqualToString("pubDate") {
fdate.appendString(string!)
}
}
}
修复程序应如下所示:
let myRssParser = ParserManager(URL: data) as! ParserManager
或者可能是这样,这取决于ParserManager的编写方式:
let myRssParser = ParserManager(url: data) as! ParserManager
甚至可能不必使用参数名称:
let myRssParser = ParserManager(data) as! ParserManager
如上所述,您不应该直接调用
alloc
和init…
方法。此外,ParserManager
类不应该有一个initWithURL
方法,而是一个带有URL
参数的init
方法。现有代码似乎遵循Objective-C模式,但Swift有自己的约定
但更广泛地说,我建议不要执行同步网络请求,当您调用NSXMLParser(contentsOfURL:)
时,就是这样。最好是异步请求数据,然后重构代码以遵循异步模式(例如,completionHandler
closures)。例如:
class ParserManager: NSObject, NSXMLParserDelegate {
/// The NSMutableArray used internally by this class
private var feeds = NSMutableArray()
/// Initiate parsing asynchronously; note, I'm returning the `NSURLSessionTask` in case you want to cancel it at some later point
func parse(URL: NSURL, completionHandler: (NSMutableArray?, NSError?)->()) -> NSURLSessionTask {
let task = NSURLSession.sharedSession().dataTaskWithURL(URL) { data, response, error in
guard data != nil else {
dispatch_async(dispatch_get_main_queue()) {
completionHandler(nil, error)
}
return
}
let parser = NSXMLParser(data: data!)
parser.delegate = self
if parser.parse() {
dispatch_async(dispatch_get_main_queue()) {
completionHandler(self.feeds, nil)
}
} else {
dispatch_async(dispatch_get_main_queue()) {
completionHandler(nil, parser.parserError)
}
}
}
task.resume()
return task
}
// NSXMLParserDelegate methods implemented here
}
然后,可以使用完成处理程序语法指定完成网络请求和解析时要执行的操作:
let URL = NSURL(string: "...")
let myRssParser = ParserManager()
myRssParser.parse(URL) { feeds, error in
guard feeds != nil else {
print(error)
return
}
// use `feeds` here, e.g.
self.feeds = feeds // update your local property
self.tableView.reloadData() // and reload the table
}
// but don't use `feeds` here, since it won't be done by the time we get here
它应该是
let parser=ParserManager(URL:data)
。不要像这样调用alloc
和init
。现在它说调用中有额外的参数“URL”。如果我将解析器代码添加到我的原始帖子中会有帮助吗?ParserManager
类中的initWithURL
应该是init
方法,带有URL
参数。像这样吗?便利初始化(url:NSURL)只需执行init(url:NSURL)
,然后(a)在该方法中使用url
,而不是url
;(b) 调用super.init();和(c)删除返回self
调用。有关init
方法的指导,请参阅Swift语言指南。我不确定。现在它说在调用中有额外的参数“URL”。如果我将我的解析器代码添加到我的原始帖子中,会有帮助吗?看起来是这样,谢谢!但现在将NSURL转换为expected()时出现问题,因此我似乎需要查看我的ParserManager代码。第二个解决方案为我提供了“额外的”url“on call”:(我想我会尝试其他方法。但是无论如何,谢谢你的帮助!哇,谢谢你的努力!我会尝试一下。老实说,我没想到会发生这样的事情。再次感谢你!仅供参考,通过将URL从init
方法移出,并移到parse
方法的参数中,你可以享受更大的简化打开(完全消除init
方法,删除一组属性等)。请参阅修订的答案。