我正在尝试在 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
用于不会更改的内容,例如 url
、category
,可能还有document
(请记住,您可以对可变对象进行常量引用)。这让编译器可以帮助您确保代码正确,并且(至少理论上)可以帮助它在构建时生成优化的代码。
我想出了什么问题,有两个问题:
- 我不得不打开NSURL
- 最大的问题是我的NSXMLDocumentContentKind.XMLKind.rawValue
是UInt
,而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)
它工作正常:)