无法转换'Meme'类型的值!期望参数类型'@noescape(Meme)throws - >布尔”

时间:2015-10-05 15:34:50

标签: arrays swift indexof

以下是代码:

    @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

2 个答案:

答案 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})

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