无法转换'Meme'类型的值!期待参数类型'@noescape(Meme)抛出 - > Bool'

Pat*_*lot 27 arrays indexof swift

这是代码:

    @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)
Run Code Online (Sandbox Code Playgroud)

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

无法将类型的值转换Meme!为预期的参数类型@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
Run Code Online (Sandbox Code Playgroud)

aya*_*aio 44

错误消息具有误导性.您实际需要的是为编译器提供一种比较两个Meme实例的方法,并确定这些实例相等的标准.

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

我们使struct符合,Equatable并且我们还创建了一个==运算符,它通过name属性比较两个结构:

struct Meme:Equatable {
    var name:String!
}

func ==(lhs: Meme, rhs: Meme) -> Bool {
    return lhs.name == rhs.name
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用indexOfMeme实例:

let doge = Meme(name: "doge")

let lolcat = Meme(name: "lolcat")

let memes = [lolcat, doge]

if let dogeIndex = memes.indexOf(doge) {
    print(dogeIndex)  // 1
}
Run Code Online (Sandbox Code Playgroud)

如果你想比较两个实例而不是它们的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
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,它hashValue是由self.name,因此两个不同的Meme实例具有相同的名称属性将被视为相等.如果您不想这样,请使用另一个源来获取哈希值.

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

  • 谢谢.试图解决这个问题很难. (2认同)

Mil*_* H. 5

如果要将比较放在indexOf方法本身中,请执行以下操作:

if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
  UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})
Run Code Online (Sandbox Code Playgroud)

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

.indexOf({$0.memedImage == selectedMeme.memedImage})
Run Code Online (Sandbox Code Playgroud)

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