额外的参数错误初始化NSXMLDocument

额外的参数错误初始化NSXMLDocument

问题描述:

我试图创建一个斯威夫特NSXMLDocument,但我发现在所谓的“额外的参数‘contentsOfURL’当我尝试创建我NSXMLDocument的时候,这里是我的代码:额外的参数错误初始化NSXMLDocument

var url = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=\(self.cityField.stringValue)&mode=xml") 
var category = NSXMLDocumentContentKind.XMLKind.rawValue 
var error: NSError? = NSError() 

var document = NSXMLDocument(contentsOfURL: url, options: category, error: &error) 

我在做什么错谢谢

编辑:其实,这种替换初始化:

var document = NSXMLDocument(contentsOfURL: url!, options: kNilOptions, error: &error) 

工程,它是所有选项参数的第一个是有问题的(也是我不得不打开url),但现在,我没有得到如何选择一个特定的选项,如果我想?这里有什么问题?

检查类型推理。 (您可以通过选项单击变量名的任何地方它是用来做这个。)你会发现它是NSURL?型(又名Optional<NSURL>),而不是NSURLNSXMLDocument初始化程序init?(contentsOfURL:options:error:)需要非可选的url,因此您对该初始化程序的调用将无法进行类型检查...,然后生成一条伪造错误消息。

(因为它没有通过类型检查,它假定你正在尝试调用不同的初始化程序......如果是这样的话,你的问题的确会是你有错误的参数,可能值得filing a bug

你得到一个可选的出你的NSURL(string:)调用因为初始化程序failable。如果您传递的字符串不是有效的URL,则该初始化程序返回nil而不是有效的NSURL实例。 Swift非常重视确保您知道并正确处理代码中的可能nil,否则它们可能会导致您的应用程序出现问题。

你的解决方案力展开可选的(通过传递url!NSXMLDocument),它满足编译“作品”:你确信被传递到NSXMLDocument值是不可选的NSURL类型。但是你并没有真正处理可能的零 - 如果你的url真的是零,你的应用程序将崩溃。在使用它之前,最安全的是test optionals for nil - 在这种情况下你真的应该这样做,因为你的字符串的内容可能在运行时改变,可能会创建一个伪造的URL。

除此之外,你对options参数类型不匹配,也:原始类型NSXMLDocumentContentKind枚举的是UInt,而是由预期的参数类型是Int。您可以将其转换为Int(NSXMLDocumentContentKind.XMLKind.rawValue)。 (这个肯定值得filing a bug - 苹果的界面应该确保枚举和初始化类型匹配。)


最后,一个不相关的提示:您正在使用var的一切,但你(只要你已经证明)不千变万化的变量指向什么。将let用于不会更改的内容,如url,categorydocument(请记住,您可以对可变对象进行常量引用)。这可以让编译器帮助您确保您的代码是正确的,并且可以(理论上至少)帮助它在构建时生成优化的代码。

+0

感谢您提供一般方法来查看错误的位置(以及这些建议)!是的,我会填写一个错误报告。感谢提到可用的初始化程序,我听过这个术语,但从来没有意识到它正在这样做,而这正是我正在寻找我的一些课程。 –

我想通了,什么是错的,有两个问题:
- 我不得不解开的NSURL
- 最大的问题是,我NSXMLDocumentContentKind.XMLKind.rawValueUIntinit期待的Int所以我代替我代码如下:

var url = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=\(self.cityField.stringValue)&mode=xml") 
var category = Int(NSXMLDocumentContentKind.XMLKind.rawValue) 
var error:NSError? 
var document = NSXMLDocument(contentsOfURL: url!, options: category, error: &error) 

,它工作正常:)