2016-03-27 12 views
5

Mam następujące klasyNie można rzucać wartość typu „NSNull” do „NSString” w parsowania JSON w szybkim

class BannerResponse : NSObject{ 

    let URL    = "Url"; 
    let CONTACT_NO   = "ContactNo"; 
    let IMAGE    = "Image"; 
    let BIG_IMAGE   = "BigImage"; 
    let ID     = "Id"; 
    let TITLE    = "Title"; 
    let NO_VIEW   = "NoView"; 
    let START_DATE   = "StartDate"; 
    let END_DATE   = "EndDate"; 


    var url:String; 
    var contactNo:String; 
    var image:String; 
    var bigImage:String; 
    var title:String; 
    var id:Int; 
    var noView:Int; 
    var startDate:String; 
    var endDate:String; 

    init(data : NSDictionary){ 

     url   = data[URL] as! String; 
     contactNo = data[CONTACT_NO] as! String; 
     image  = data[IMAGE] as! String; 
     bigImage = data[BIG_IMAGE] as! String; 
     title  = data[TITLE] as! String; 
     id   = data[ID] as! Int; 
     noView  = data[NO_VIEW] as! Int; 
     startDate = data[START_DATE] as! String; 
     endDate  = data[END_DATE] as! String; 
    } 
} 

kiedy uruchomić kod, mam następujący błąd

Could not cast value of type 'NSNull' (0x10a85f378) to 'NSString' (0x109eccb20). 

EDIT

do { 

          if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary{ 

           onSuccess(BannerResponse(data: json)) 
          } 
         } catch { 

          onFail() 
         } 
+0

Jak otrzymujesz ten słownik? Czy analizujesz JSON za pomocą 'NSJSONSerialization' lub innej biblioteki? –

+0

@DuncanC sprawdź moją edycję –

Odpowiedz

19

Jednym z twojej data[SOME_KEY] jest typu NSNull zamiast String i ponieważ wymuszasz obsadę na String przy użyciu aplikacji !, aplikacja ulega awarii.

Można zrobić jedną z dwóch rzeczy:

  1. Zmień swoje zmienne od klasy BannerResponse być opcjonalne. I użyj ? zamiast ! podczas ustawiania wartości w metodzie init. Tak:

`

var title: String? 

init(data: NSDictionary) 
{ 
    self.title = data[TITLE] as? String 
} 

lub

  1. Zastosowanie ? zamiast ! przy ustalaniu wartości w metodzie init ale ustawić wartość domyślną ilekroć dict[SOME_KEY] jest zero lub nie jest oczekiwanym typem. To będzie wyglądać mniej więcej tak:

`

if let title = data[TITLE] as? String 
{ 
    self.title = title 
} 
else 
{ 
    self.title = "default title" 
} 

// Shorthand would be: 
// self.title = data[TITLE] as? String ?? "default title" 

I chyba trzecią rzeczą jest zapewnienie, że serwer nigdy nie zsyła na wartości null. Jest to jednak niepraktyczne, ponieważ nie ma czegoś takiego jak nigdy. Powinieneś napisać kod po stronie klienta, aby założyć, że każda wartość w JSON może być pusta lub nieoczekiwany.

+0

Bardzo dziękuję za pomoc :) –

-1

Otrzymujesz wartości null dla niektórych kluczy. Zostały zmapowane do NSNull przez NSJSONSerialization.

Trzeba zrobić kilka rzeczy

zmienić wszystkie zmienne (url, contactNo itp) do optionals:

var url:String? 
var contactNo:String? 

zmienić wszystkie swoje zadania w użyciu ? zamiast !:

url = noNulls[URL] as? String 
contactNo = noNulls[CONTACT_NO] as? String 

I na koniec spraw, aby kod obsługiwał wartości zerowe dla wszystkich zmiennych. (Ale nie używaj !. Ta ścieżka prowadzi do awarii.)

+0

Bardzo dziękuję za pomoc :) –

+0

Ten krok z 'noNull' jest zupełnie niepotrzebny. 'jak?String' może obsłużyć 'NSNull' po prostu w porządku. – Sulthan

+0

Zgaduję, że masz rację. –

Powiązane problemy