swift
  • initialization
  • nsdata
  • xcode6
  • 2014-09-22 49 views 5 likes 
    5

    我有以下行:迅速處理NSData的初始化失敗

    let jsonResults = NSData(contentsOfURL: Fetcher.URLforLicenseInfo()) 
    

    這編譯和執行正常,但如果的NSData的初始化失敗,我得到一個異常後面的代碼。我嘗試添加另一行:

    if jsonResults != nil { ///blah, blah... 
    

    但隨後的編譯器抱怨"Cannot invoke '!=' with an argument list type '(NSData, NilLiteralConvertible)"

    不應該編譯器識別的NSData初始化器返回類型爲可選?

    +0

    如果第一行改爲'讓jsonResults:NSData的! = NSData(contentsOfURL:...''可以檢查'如果jsonResults!= nil {...',並且它在NSData()失敗時工作正常,爲什麼NSData永遠不會返回nil!? – user2041042 2014-09-22 08:29:32

    +0

    因爲NSData()是構造函數,不是方法,它返回當前對象的引用 – 2014-09-22 09:05:21

    +0

    我可以在方法和構造函數之間做出區別,在我之前的註釋中,當jsonResults == nil時,它表示NSData()返回了nil ... – user2041042 2014-09-22 11:23:44

    回答

    2

    NSData初始者將永遠不會返回nil。另一方面,當你寫jsonResults != nil意味着jsonResults預計是可選的,但事實並非如此。

    if jsonResults != nil {}條件沒有意義。

    相反,你可以檢查數據對象jsonResults.length


    當使用if != nil語句包含的字節數?

    考慮下面的例子:

    func toJson() -> NSData? { 
        return nil // dummy 
    } 
    
    let jsonResults:NSData? = toJson() // jsonResults must be optional 
    
    if jsonResults != nil{ 
        println(jsonResults!.length) // The number of bytes contained by the data object. 
    } 
    

    當心:由於jsonResults是恆定的(又名let)其只讀變量,你不能,即使這個值了nil將來改變它


    參考

    extension NSData {  
        // ... 
        init(contentsOfURL url: NSURL) 
        // ... 
    } 
    
    3

    檢查數據的長度:if(data.length > 0) ...

    相關問題