初始化 NSXMLDocument 时出现额外的参数错误



我正在尝试在 Swift 中创建 NSXMLDocument,但是当我尝试创建我的 NSXMLDocument 时,我在调用中收到一个"额外的参数'contentOfURL',这是我的代码:

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),但现在,如果我想,我不知道如何选择特定选项?这里有什么问题?

检查url的类型推断。(您可以通过按住 Option 键单击变量名称来执行此操作。你会发现它是 NSURL? 型(又名 Optional<NSURL> ),而不是 NSURL .NSXMLDocument初始值设定项init?(contentsOfURL:options:error:)需要一个非可选的 URL,因此对该初始值设定项的调用无法进行类型检查...然后生成虚假错误消息。

(因为它未通过类型检查,所以它假定您正在尝试调用不同的初始值设定项...如果是这样,你的问题确实是你有错误的论点。可能值得提交一个错误。

您可以从NSURL(string:)调用中获得一个可选项,因为该初始值设定项可失败。如果传递的字符串不是有效的 URL,则该初始值设定项将返回 nil 而不是有效的 NSURL 实例。Swift 非常认真地确保您了解并正确处理代码中可能的 nil,否则它们可能会给您的应用程序带来问题。

强制解开可选(通过将url!传递给NSXMLDocument)的解决方案"有效",因为它满足编译器:您已确保传递给NSXMLDocument的值是非可选的NSURL类型。但是你还没有真正处理可能的 nil - 如果你的 url 真的是 nil,你的应用程序将在该行崩溃。在使用 nil 之前测试它们的 optionals 是最安全的——在这种情况下,你真的应该这样做,因为你的字符串的内容可能会在运行时发生变化,可能会创建一个虚假的 URL。

除此之外,options参数的类型不匹配:NSXMLDocumentContentKind枚举的原始类型是UInt,但该参数所需的类型是Int。您可以使用 Int(NSXMLDocumentContentKind.XMLKind.rawValue) .(这个绝对值得提交一个错误 - Apple的接口应该确保枚举和初始值设定项类型匹配。


最后,一个不相关的提示:你对所有事情都使用var,但你(就你已经展示的)从来没有改变你的变量指向什么。将 let 用于不会更改的内容,例如 urlcategory ,可能还有document(请记住,您可以对可变对象进行常量引用)。这让编译器可以帮助您确保代码正确,并且(至少理论上)可以帮助它在构建时生成优化的代码。

我想出了什么问题,有两个问题:
- 我不得不打开NSURL
- 最大的问题是我的NSXMLDocumentContentKind.XMLKind.rawValueUInt,而init期待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)

它工作正常:)

最新更新