无法转换“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})
但是如果你想逐像素地比较它们,或者比较缩放到不同尺寸的相同图像,那就更复杂一点了。