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.