Só para adicionar isso, porque eu estava recebendo esse erro também. Ao passar por todas essas respostas, a maioria parece se aplicar ao trabalho com a interface do usuário e o material do storyboard. Eu sei que o pôster original parecia estar funcionando com a interface do usuário, mas, ao procurar possíveis razões para esse erro, quase todas as perguntas levam a essa pergunta, com as outras sendo fechadas como duplicatas ou simplesmente tendo problemas para conectar as coisas em um storyboard, então adicione minha solução.
Eu estava trabalhando na codificação de um serviço da Web no Swift 2. Criei todos os objetos e stubs de proxy necessários. Enquanto eu percorria o XML retornado, instanciava dinamicamente meus objetos, os quais eram provenientes NSObject
e usados setValue:forKey
neles. Toda vez que setValue:forKey
tentava definir uma propriedade, ela explodia com esse erro.
Eu tive uma instrução switch para cada tipo eu estava lidando com (por exemplo Bool?
, CShort?
, String?
) e para cada nó XML que eu passei e verificado que o tipo era sobre o objeto e, em seguida, convertido o valor para esse tipo e tentou configurá-lo com setValue:forKey
.
Eventualmente, comecei a comentar todas essas setValue:forKey
linhas e descobri que meu default
caso de declaração de chave funcionava String?
.
Finalmente descobri que você não pode usar tipos swift opcionais, a setValue:forKey
menos que eles tenham um mapeamento direto para um tipo Objective-C como String?
ou NSNumber?
. Acabei alterando todos os CShort?
tipos para, NSNumber?
uma vez que possui um mapeamento direto. Pois Bool?
no meu caso, era bom apenas usar Bool
e inicializá-lo false
. Outros podem não ter esse luxo.
De qualquer forma, que dor de cabeça que foi tão esperançosamente isso ajuda alguém que tem um problema semelhante e continua sendo redirecionado para esta pergunta e dizendo para si mesmo: "Não estou fazendo nada na interface do usuário !!".
Por fim, reiterar mais uma vez a codificação de valor-chave não funciona com opcionais. Abaixo, acabei encontrando algum lugar, mas esqueço onde, para quem postou isso, peço desculpas e daria crédito se me lembrasse de onde encontrei isso, mas ele salvou minha vida:
Você não pode usar o KVC em uma propriedade Int opcional, porque o KVC é cacau / Objective-C e o Objective-C não pode ver um Int opcional - ele não é vinculado ao Objective-C. O Objective-C pode ver apenas os tipos com ponte para o Objective-C:
tipos de classe que são derivados de NSObject
tipos de classe que são expostos com @objc
Estruturas rápidas em ponte