2014-09-22 26 views
5

Tôi có dòng sau:nhanh chóng xử lý NSData khởi động thất bại

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

này biên soạn và thực hiện tốt nhưng nếu khởi động của NSData thất bại tôi nhận được một ngoại lệ sau trong các mã. Tôi đã cố gắng thêm một dòng:

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

nhưng sau đó trình biên dịch phàn nàn "Cannot invoke '!=' with an argument list type '(NSData, NilLiteralConvertible)"

nên không trình biên dịch nhận NSData initialiser kiểu trả về như một tùy chọn?

+0

Nếu dòng đầu tiên được thay đổi cho 'hãy jsonResults: NSData! = NSData (contentsOfURL: ... 'có thể kiểm tra' if jsonResults! = Nil {... 'và nó hoạt động tốt khi NSData() thất bại. Tại sao nếu NSData không trả về nil !? – user2041042

+0

vì' NSData() 'là hàm tạo, Nó trả về tham chiếu của đối tượng hiện tại –

+0

Tôi có thể tạo sự khác biệt giữa phương thức và hàm tạo.Trong chú thích trước đây của tôi khi jsonResults == nil nó có nghĩa là NSData() đã trả về nil ... – user2041042

Trả lời

2

NSData trình khởi tạo sẽ không bao giờ trả về nil. Mặt khác, khi bạn viết jsonResults != nil có nghĩa là jsonResults được mong đợi là Tùy chọn nhưng không phải.

Điều kiện if jsonResults != nil {} không có ý nghĩa.

Thay vào đó bạn có thể kiểm tra số byte chứa bởi các đối tượng dữ liệu jsonResults.length


Khi sử dụng if != nil tuyên bố?

xem xét sau Ví dụ:

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. 
} 

Hãy coi chừng: Kể từ jsonResults là hằng số (aka let) của nó read-only biến và bạn không thể thay đổi nó trong tương lai ngay cả khi giá trị này có nil


Reference

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

kiểm tra độ dài của dữ liệu: if(data.length > 0) ...

Các vấn đề liên quan