我试图用Swift创建一个NSXMLDocument,但是当我试图创建我的NSXMLDocument时,在调用中得到了一个“Extra argument'contentsOfURL',下面是我的代码:

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)

好吧,首先是options参数有问题(而且我不得不打开url),但是现在,如果我想的话,我不知道如何选择一个特定的选项?这里有什么问题?

最佳答案

检查url的类型推断。(您可以通过在使用变量名的任何地方单击该变量名来完成此操作。)您会发现它的类型是NSURL?(又称Optional<NSURL>),而不是NSURL。初始值设定项需要一个非可选的url,因此调用该初始值设定项将无法进行类型检查。。。然后产生一个虚假的错误消息。
(因为它没有通过类型检查,所以它假定您正在尝试调用另一个初始值设定项。。。如果是这样的话,你的问题就在于你的论点是错误的。可能值得一提。)
您可以从NSXMLDocument调用中获得一个可选的,因为初始化器是filing a bug。如果传递的字符串不是有效的URL,则该初始值设定项返回nil,而不是有效的init?(contentsOfURL:options:error:)实例。Swift非常认真地确保您知道并正确处理代码中可能出现的nil,因为否则它们会给您的应用程序带来问题。
强制展开可选项(通过将NSURL(string:)传递给NSURL)的解决方案“有效”,因为它满足编译器的要求:您已确保传递给url!的值是非可选的NSXMLDocument类型。但你还没有真正处理可能的nil-如果你的url真的是nil,你的应用程序将崩溃在那一行。在使用它们之前failable是最安全的,在这种情况下,您确实应该这样做,因为字符串的内容在运行时可能会更改,可能会创建一个虚假的URL。
除此之外,NSXMLDocument参数的类型也不匹配:NSURL枚举的原始类型是options,但该参数所期望的类型是NSXMLDocumentContentKind。您可以使用UInt转换它。(这一个绝对值得test optionals for nil关于-苹果的接口应该确保枚举和初始值设定项类型匹配。)
最后,一个不相关的提示:你对每件事都使用Int,但你(就你所展示的)从来没有改变过你的变量指向什么。对于那些没有改变的东西,比如Int(NSXMLDocumentContentKind.XMLKind.rawValue)var,或者可能let(记住,您可以有一个对可变对象的常量引用)。这使得编译器可以帮助您确保您的代码是正确的,并且可以(至少理论上)帮助它在构建时生成优化的代码。

08-16 01:16