无法转换“Meme!”types的值 到预期的参数types“@noescape(Meme)throws – > Bool'

这里是代码:

@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) 

(selectedMeme)处的.indexOf方法发生错误。

不能转换typesMeme!Meme! 到预期的参数types@noescape (Meme) throws -> Bool

米姆! 是我的应用程序的结构。 我如何通过这个工作?

 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 

错误消息是误导。 你真正需要的是为编译器提供一种比较两个Meme实例的方法,并决定哪些实例是相同的。

假设您希望具有相同name属性的两个实例被视为相等。

我们使结构符合Equatable并且我们还创build一个==运算符,用它们的name属性比较两个结构:

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

现在我们可以用一个Meme实例来使用indexOf

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

如果你想比较两个实例,而不是他们的name属性,但由他们的唯一性,那么你将不得不使结构符合Hashable并使用一个唯一的hashValue属性返回一个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 } 

在这个例子中, hashValue是由self.name ,所以具有相同name属性的两个不同的Meme实例将被认为是相等的。 如果你不想要,使用另一个来源的哈希值。

注意:在Swift 3中, indexOf已经成为index(of:) ,所以对于这个例子,我们将memes.indexOf(doge)更改为memes.index(of: doge)

如果你想在indexOf方法本身进行比较,就像这样做:

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

可能不是比较图像的最佳方式。 如果您知道图像是相同的对象,您可以使用:

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

但是如果你想逐像素地比较它们,或者比较缩放到不同尺寸的相同图像,那就更复杂一点了。