2015-01-06 38 views
0

我試圖創建一個斯威夫特NSXMLDocument,但我發現在所謂的「額外的參數‘contentsOfURL’當我嘗試創建我NSXMLDocument的時候,這裏是我的代碼:額外的參數錯誤初始化NSXMLDocument

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),但現在,我沒有得到如何選擇一個特定的選項,如果我想?這裏有什麼問題?

回答

2

檢查類型推理。 (您可以通過選項單擊變量名的任何地方它是用來做這個。)你會發現它是NSURL?型(又名Optional<NSURL>),而不是NSURLNSXMLDocument初始化程序init?(contentsOfURL:options:error:)需要非可選的url,因此您對該初始化程序的調用將無法進行類型檢查...,然後生成一條僞造錯誤消息。

(因爲它沒有通過類型檢查,它假定你正在嘗試調用不同的初始化程序......如果是這樣的話,你的問題的確會是你有錯誤的參數,可能值得filing a bug

你得到一個可選的出你的NSURL(string:)調用因爲初始化程序failable。如果您傳遞的字符串不是有效的URL,則該初始化程序返回nil而不是有效的NSURL實例。 Swift非常重視確保您知道並正確處理代碼中的可能nil,否則它們可能會導致您的應用程序出現問題。

你的解決方案力展開可選的(通過傳遞url!NSXMLDocument),它滿足編譯「作品」:你確信被傳遞到NSXMLDocument值是不可選的NSURL類型。但是你並沒有真正處理可能的零 - 如果你的url真的是零,你的應用程序將崩潰。在使用它之前,最安全的是test optionals for nil - 在這種情況下你真的應該這樣做,因爲你的字符串的內容可能在運行時改變,可能會創建一個僞造的URL。

除此之外,你對options參數類型不匹配,也:原始類型NSXMLDocumentContentKind枚舉的是UInt,而是由預期的參數類型是Int。您可以將其轉換爲Int(NSXMLDocumentContentKind.XMLKind.rawValue)。 (這個肯定值得filing a bug - 蘋果的界面應該確保枚舉和初始化類型匹配。)


最後,一個不相關的提示:您正在使用var的一切,但你(只要你已經證明)不千變萬化的變量指向什麼。將let用於不會更改的內容,如url,categorydocument(請記住,您可以對可變對象進行常量引用)。這可以讓編譯器幫助您確保您的代碼是正確的,並且可以(理論上至少)幫助它在構建時生成優化的代碼。

+0

感謝您提供一般方法來查看錯誤的位置(以及這些建議)!是的,我會填寫一個錯誤報告。感謝提到可用的初始化程序,我聽過這個術語,但從來沒有意識到它正在這樣做,而這正是我正在尋找我的一些課程。 –

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) 

,它工作正常:)