以下是代码:
@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)
错误发生在.indexOf
的{{1}}方法。
无法将(selectedMeme)
类型的值转换为预期的参数类型Meme!
模因!是我的应用程序的结构。我该如何解决这个问题?
@noescape (Meme) throws -> Bool
答案 0 :(得分:44)
错误消息具有误导性。您实际需要的是为编译器提供一种比较两个Meme
实例的方法,并确定这些实例相等的标准。
假设您希望将具有相同name
属性的两个实例视为相等。
我们使结构符合Equatable
并且我们还创建了一个==
运算符,它通过名称属性比较两个结构:
struct Meme:Equatable {
var name:String!
}
func ==(lhs: Meme, rhs: Meme) -> Bool {
return lhs.name == rhs.name
}
现在我们可以将indexOf
与Meme实例一起使用:
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
,因此具有相同名称属性的两个不同Meme实例将被视为相等。如果您不想这样做,请使用其他来源获取哈希值。
注意:在Swift 3中,indexOf
已成为index(of:)
,因此对于此示例,我们会将memes.indexOf(doge)
更改为memes.index(of: doge)
。
答案 1 :(得分:5)
如果要将比较放在indexOf方法本身中,请执行以下操作:
if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})
可能不是比较图像的最佳方式。如果您知道图像是同一个对象,则可以使用:
.indexOf({$0.memedImage == selectedMeme.memedImage})
但是如果你想逐个像素地比较它们或比较缩放到不同尺寸的相同图像,那就更复杂了。