No se puede convertir el valor del tipo ‘Meme!’ al tipo de argumento esperado ‘@noescape (Meme) throws -> Bool’

Aquí está el 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) 

El error ocurre en el método .indexOf en (selectedMeme) .

No se puede convertir el valor del tipo Meme! al tipo de argumento esperado @noescape (Meme) throws -> Bool

Meme! es una estructura para mi aplicación ¿Cómo trabajo esto?

 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 

El mensaje de error es engañoso. Lo que realmente necesita es proporcionar al comstackdor una forma de comparar dos instancias de Meme y decidir qué criterios son iguales.

Supongamos que quiere que dos instancias tengan la misma propiedad de name para ser tratadas como iguales.

Hacemos que la estructura se ajuste a Equatable y también creamos un operador == que compara dos estructuras por su propiedad de nombre:

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

Ahora podemos usar indexOf con una instancia de Meme:

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

Si quisiera comparar dos instancias no por su propiedad de name sino por su singularidad, entonces tendría que hacer que la estructura se conforme a Hashable y usar una propiedad hashValue única que hashValue un valor 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 } 

En este ejemplo, hashValue está hecho de self.name , por lo que dos instancias diferentes de Meme con una propiedad de mismo nombre se considerarán iguales. Si no quiere eso, use otra fuente para el valor hash.

Nota: en Swift 3, indexOf ha convertido en index(of:) , por lo que para este ejemplo cambiaríamos memes.indexOf(doge) a memes.index(of: doge) .

Si desea colocar la comparación dentro del método indexOf, hágalo así:

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

Probablemente no sea la mejor manera de comparar imágenes. Si sabes que las imágenes son el mismo objeto, puedes usar:

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

pero si quiere compararlos píxel por píxel o comparar la misma imagen escalada a diferentes tamaños, eso es un poco más complicado.