swift
  • initialization
  • nsdata
  • xcode6
  • 2014-09-22 28 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) ...

    相关问题