2016-09-27 16 views
9

Od iOS10, jestem stoi do tej kwestii:Nie można rzucać wartość typu NSSingleObjectArray do NSMutableArray

Nie można rzucać wartość typu „” do __NSSingleObjectArrayI „NSMutableArray”.

Jest to mój kod:

manage.POST(url, parameters: params, 
        constructingBodyWithBlock: { (data: AFMultipartFormData!) in 
         //Some stuff here 
      }, 
        success: { (operation: NSURLSessionDataTask?, responseObject: AnyObject?) in 

         var array : NSMutableArray! 

         if AppConfig.sharedInstance().OCR == "2"{ 
          let dictionnary = responseObject as! NSDictionary 
          array = dictionnary["data"]! as! NSMutableArray 
         }else{ 
          //!!!!CRASH HERE!!!!!  
          array = responseObject as! NSMutableArray 
         } 
         //Some stuff after 
} 

Kiedy patrzę na wartości responseObject, mam to w moim konsoli:

Printing description of responseObject: 
▿ Optional<AnyObject> 
    ▿ Some : 1 elements 
    - [0] : Test  

Jak można wyodrębnić wartość "Test" z responseObject?

Dziękujemy

+3

Jak zwykle, nie używaj zmiennych typów kolekcji Fundacji w Swift. Szkoda jest większa niż (widoczna) korzyść. – vadian

Odpowiedz

13

Katastrofa Dzieje się tak dlatego można zakładać, że obiekt jest NSMutableArray pojawić, mimo że obiekt został stworzony poza kodzie.

W tym przypadku tablica otrzymana przez kod jest instancją macierzy zoptymalizowanej do obsługi pojedynczego elementu; dlatego obsada się nie udaje.

Kiedy to nastąpi, można zrobić zmienny kopię obiektu:

array = (dictionnary["data"]! as! NSArray).mutableCopy() as! NSMutableArray 

i

array = (responseObject as! NSArray).mutableCopy() as! NSMutableArray 
6

Kiedy mamy do czynienia z odpowiedzi od serwera WWW wówczas nie możemy na pewno o obiektach i typy. Więc lepiej jest sprawdzać i używać obiektów zgodnie z naszą potrzebą. Zobacz w celu odniesienia się do twojego pytania.

if let dictionnary : NSDictionary = responseObject as? NSDictionary { 

    if let newArr : NSArray = dictionnary.objectForKey("data") as? NSArray { 

      yourArray = NSMutableArray(array: newArr) 
     } 

} 

Dzięki temu twoja aplikacja nigdy się nie zawiesza, ponieważ jest to czysty warunek dla twoich potrzebnych obiektów ze sprawdzaniem typów. Jeśli twój klucz "data" jest tablicą, to tylko on będzie kontynuował twoją tablicę. Dzięki.

Powiązane problemy