index from first data arreglos array arrays swift indexof

arrays - from - No se puede convertir el valor del tipo ''Meme!'' al argumento esperado escriba ''@noescape(Meme) lanza-> Bool''



search in array swift 4 (2)

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

Supongamos que desea que dos instancias con la misma propiedad de name se traten 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 desea comparar dos instancias, no por su propiedad de name sino por su unicidad, entonces debería hacer que la estructura se ajuste a Hashable y usar una propiedad hashValue única que hashValue un 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, el hashValue está hecho de self.name , por lo que dos instancias diferentes de Meme con una misma propiedad de 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) .

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 de tipo Meme! al argumento esperado escriba @noescape (Meme) throws -> Bool

Meme es una estructura para mi aplicación. ¿Cómo trabajo a través de 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


Si desea poner 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 sabe que las imágenes son el mismo objeto, puede usar:

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

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