0

我正在尝试在 Swift 中创建一个 NSXMLDocument,但是当我尝试创建我的 NSXMLDocument 时,我在调用中收到一个“额外的参数‘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)

工作,首先是有问题的选项参数(而且我必须解开url),但是现在,如果我想,我不知道如何选择特定选项?这里有什么问题?

4

2 回答 2

2

检查类型推断url。(您可以通过在使用变量名的任何位置单击选项来完成此操作。)您会发现它的类型是NSURL?(aka Optional<NSURL>),而不是NSURL. NSXMLDocument初始化程序init?(contentsOfURL:options:error:)需要一个非可选的 url,因此您对该初始化程序的调用会导致类型检查失败……然后会产生虚假的错误消息。

(因为它没有通过类型检查,所以它假定您正在尝试调用不同的初始化程序......如果是这样,您的问题确实是您有错误的参数。可能值得提交一个错误。)

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

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

除此之外,您的参数也存在类型不匹配:枚举options的原始类型是,但该参数预期的类型是。你可以用. (这绝对值得提交一个错误——Apple 的接口应该确保枚举和初始化器类型匹配。)NSXMLDocumentContentKindUIntIntInt(NSXMLDocumentContentKind.XMLKind.rawValue)


最后,一个不相关的提示:你正在使用var一切,但你(就你所展示的而言)永远不会改变你的变量指向的东西。用于let不会改变的事物,例如url,category和可能document(请记住,您可以对可变对象进行常量引用)。这让编译器可以帮助您确保您的代码是正确的,并且可以(至少在理论上)帮助它在构建时生成优化的代码。

于 2015-01-06T19:15:36.960 回答
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)

它工作正常:)

于 2015-01-06T19:03:03.287 回答