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

时间:2015-01-06 18:47:06

标签: swift nsxmldocument

我正在尝试在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,首先是选项参数有问题(而且我还需要打开网址),但是现在,如果我愿意的话,我还没有得到如何选择特定选项?这有什么问题?

2 个答案:

答案 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)表示不会发生变化的内容,例如varlet,可能url(请记住,您可以对可变对象进行常量引用) 。这使编译器可以帮助您确保代码正确,并且(理论上至少)可以帮助它在构建时生成优化代码。

答案 1 :(得分:1)

我弄清楚出了什么问题,有两个问题:
  - 我不得不打开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)

它运作良好:)