Não é possível converter o valor do tipo ‘Meme!’ ao tipo de argumento esperado ‘@noescape (Meme) throws -> Bool’

Aqui está o código:

@IBAction func deleteMeme(sender: UIBarButtonItem) { if let foundIndex = MemeRepository.sharedInstance.memes.indexOf(selectedMeme) { //remove the item at the found index MemeRepository.sharedInstance.memes.removeAtIndex(foundIndex) navigationController?.popViewControllerAnimated(true) 

O erro ocorre no método .indexOf em (selectedMeme) .

Não é possível converter o valor do tipo Meme! para o tipo de argumento esperado @noescape (Meme) throws -> Bool

Meme! é uma estrutura para meu aplicativo. Como eu trabalho com isso?

 struct Meme { var topText : String! var bottomText: String! var image: UIImage! var memedImage: UIImage! init(topText: String, bottomText: String, image: UIImage, memedImage: UIImage) { self.topText = topText self.bottomText = bottomText self.image = image self.memedImage = memedImage 

A mensagem de erro é enganosa. O que você realmente precisa é fornecer ao compilador uma maneira de comparar duas instâncias Meme e decidir em quais critérios essas instâncias são iguais.

Digamos que você queira que duas instâncias com a mesma propriedade de name sejam tratadas como iguais.

Tornamos a estrutura em conformidade com o Equatable e também criamos um operador == que compara duas estruturas por sua propriedade de nome:

 struct Meme:Equatable { var name:String! } func ==(lhs: Meme, rhs: Meme) -> Bool { return lhs.name == rhs.name } 

Agora podemos usar indexOf com uma instância Meme:

 let doge = Meme(name: "doge") let lolcat = Meme(name: "lolcat") let memes = [lolcat, doge] if let dogeIndex = memes.indexOf(doge) { print(dogeIndex) // 1 } 

Se você quisesse comparar duas instâncias não por sua propriedade de name , mas por sua exclusividade, então você teria que fazer a estrutura estar em conformidade com o Hashable e usar uma propriedade hashValue exclusiva retornando um Int:

 struct Meme:Hashable { var name:String! var hashValue: Int { return self.name.hashValue } init(name: String) { self.name = name } } func ==(lhs: Meme, rhs: Meme) -> Bool { return lhs.hashValue == rhs.hashValue } let doge = Meme(name: "doge") let lolcat = Meme(name: "lolcat") let memes = [lolcat, doge] if let dogeIndex = memes.indexOf(doge) { print(dogeIndex) // 1 } 

Neste exemplo, o hashValue é feito de self.name , portanto, duas instâncias diferentes de Meme com uma propriedade de mesmo nome serão consideradas iguais. Se você não quiser isso, use outra fonte para o valor de hash.

Nota: no Swift 3, indexOf se tornou index(of:) , então para este exemplo nós memes.indexOf(doge) para memes.index(of: doge) .

Se você quiser colocar a comparação dentro do próprio método indexOf, faça assim:

 if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({ UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)}) 

Provavelmente não é a melhor maneira de comparar imagens. Se você souber que as imagens são o mesmo object, você pode usar:

 .indexOf({$0.memedImage == selectedMeme.memedImage}) 

mas se você quiser compará-los pixel a pixel ou comparar a mesma imagem dimensionada para tamanhos diferentes, isso é um pouco mais complicado.

    Intereting Posts