2
respostas

Fatal error: Unexpectedly found nil while unwrapping an Optional value

Ao ler o arquivo que foi gravado o compilador apresenta o erro acima na linha

self.happiness = aDecoder.decodeObject(forKey: "happiness") as! Int

Na classe Meal, no Console:

  • self...
  • name = (string) "Brownie"
  • happiness = (Int) 0 ...

Alguém já teve este erro?

2 respostas

Resumindo:

Use decodeInteger(forKey :) ao invés de decodeObject(forKey :).

Explicando:

Ao usar decodeObject(forKey :) para leitura/desserializar, ele retorna nulo (nil) por causa da sobrecarga de operador que é feita no momento da serialização/gravação com o método genérico encode(_: forKey :). No seu caso, o encode trata a variável happiness como um Int, pela definição dela, para depois gravar-lo como um tipo NSNumber, inferindo sobre o seu tipo, e não um NSObject. Após isso, você não pode ler/desserializa-lo como um Object (o que resultará em nulo/nil) e forçar o casting para Int (já que NSObject não é sua instância). Ou seja, temos dois erros.

Tem uma explicação boa sobre isso tudo neste artigo do stackoverflow, contudo, está em inglês: https://stackoverflow.com/questions/51751677/how-to-cast-from-int-to-nsnumber

Não é exatamente o que esta acontecendo com você, mas explica sobre essa problemática de encode/decode e casting.

Um livro muito bom que explica tudo no isso detalhe são os Programming Fundamentals with Swift, do Matt Neuberg.

Espero ter ajudado. Acabei estudando o assunto também. Obrigado!

Olá Diego.

Obrigado pela orientação, consegui resolver desta forma.

Grande Abraço

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software