我试图用Swift创建一个NSXMLDocument,但是当我试图创建我的NSXMLDocument时,在调用中得到了一个“Extra argument'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)
好吧,首先是options参数有问题(而且我不得不打开url),但是现在,如果我想的话,我不知道如何选择一个特定的选项?这里有什么问题?
最佳答案
检查url
的类型推断。(您可以通过在使用变量名的任何地方单击该变量名来完成此操作。)您会发现它的类型是NSURL?
(又称Optional<NSURL>
),而不是NSURL
。初始值设定项需要一个非可选的url,因此调用该初始值设定项将无法进行类型检查。。。然后产生一个虚假的错误消息。
(因为它没有通过类型检查,所以它假定您正在尝试调用另一个初始值设定项。。。如果是这样的话,你的问题就在于你的论点是错误的。可能值得一提。)
您可以从NSXMLDocument
调用中获得一个可选的,因为初始化器是filing a bug。如果传递的字符串不是有效的URL,则该初始值设定项返回nil,而不是有效的init?(contentsOfURL:options:error:)
实例。Swift非常认真地确保您知道并正确处理代码中可能出现的nil,因为否则它们会给您的应用程序带来问题。
强制展开可选项(通过将NSURL(string:)
传递给NSURL
)的解决方案“有效”,因为它满足编译器的要求:您已确保传递给url!
的值是非可选的NSXMLDocument
类型。但你还没有真正处理可能的nil-如果你的url真的是nil,你的应用程序将崩溃在那一行。在使用它们之前failable是最安全的,在这种情况下,您确实应该这样做,因为字符串的内容在运行时可能会更改,可能会创建一个虚假的URL。
除此之外,NSXMLDocument
参数的类型也不匹配:NSURL
枚举的原始类型是options
,但该参数所期望的类型是NSXMLDocumentContentKind
。您可以使用UInt
转换它。(这一个绝对值得test optionals for nil关于-苹果的接口应该确保枚举和初始值设定项类型匹配。)
最后,一个不相关的提示:你对每件事都使用Int
,但你(就你所展示的)从来没有改变过你的变量指向什么。对于那些没有改变的东西,比如Int(NSXMLDocumentContentKind.XMLKind.rawValue)
,var
,或者可能let
(记住,您可以有一个对可变对象的常量引用)。这使得编译器可以帮助您确保您的代码是正确的,并且可以(至少理论上)帮助它在构建时生成优化的代码。