我正在尝试在Swift中创建一个NSXMLDocument,但是当我尝试创建我的NSXMLDocument时,我正在调用“Extra argument'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)
Works,首先是选项参数有问题(而且我还需要打开网址),但是现在,如果我愿意的话,我还没有得到如何选择特定选项?这有什么问题?
答案 0 :(得分:2)
检查url
的类型推断。 (您可以通过选择 - 在任何使用过的地方点击变量名称来执行此操作。)您将找到NSURL?
类型(又名Optional<NSURL>
),而不是{ {1}}。 NSURL
初始值设定项NSXMLDocument
需要一个非可选的url,因此您对该初始值设定项的调用无法进行类型检查...然后会产生一个虚假的错误消息。
(因为它没有通过类型检查,它假设您正在尝试调用不同的初始化程序...如果是这样,那么您的问题确实会出现错误的参数。可能值得{{3关于。)
您的init?(contentsOfURL:options:error:)
调用中有一个可选项,因为该初始值设定项为filing a bug。如果传递的字符串不是有效的URL,则该初始值设定项将返回nil而不是有效的NSURL(string:)
实例。 Swift非常认真地确保您了解并正确处理代码中可能存在的nils,否则会导致您的应用出现问题。
你的强制解包方案(通过NSURL
传递给url!
)&#34;解决了这个问题。&#34;因为它满足编译器:您已确保传递给NSXMLDocument
的值是非可选的NSXMLDocument
类型。但是你还没有真正处理可能的零 - 如果你的网址真的是零,你的应用程序就会崩溃。 failable使用它们之前最安全 - 在这种情况下你真的应该这样做,因为字符串的内容可能会在运行时发生变化,可能会造成虚假URL。
除此之外,NSURL
参数的类型也不匹配:options
枚举的原始类型为NSXMLDocumentContentKind
,但该参数所需的类型为{{ 1}}。您可以使用UInt
进行转换。 (这个绝对值得test optionals for nil - Apple的接口应该确保枚举和初始化器类型匹配。)
最后,一个不相关的提示:您正在使用Int
表示所有内容,但您(至于您已经显示)并未改变您的变量所指向的内容。使用Int(NSXMLDocumentContentKind.XMLKind.rawValue)
表示不会发生变化的内容,例如var
,let
,可能url
(请记住,您可以对可变对象进行常量引用) 。这使编译器可以帮助您确保代码正确,并且(理论上至少)可以帮助它在构建时生成优化代码。
答案 1 :(得分:1)
我弄清楚出了什么问题,有两个问题:
- 我不得不打开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)
它运作良好:)