【问题标题】:Cannot convert value of type 'Meme!' to expected argument type '@noescape (Meme) throws -> Bool'无法转换类型“Meme!”的值到预期的参数类型'@noescape (Meme) throws -> Bool'
【发布时间】:2016-01-02 08:01:44
【问题描述】:

代码如下:

    @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 方法中。

无法将 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

【问题讨论】:

    标签: arrays swift indexof


    【解决方案1】:

    错误信息具有误导性。您真正需要的是为编译器提供一种方法来比较两个 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 并使用返回 Int 的唯一 hashValue 属性:

    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
    }
    

    在此示例中,hashValueself.name 组成,因此具有相同名称属性的两个不同 Meme 实例将被视为相等。如果您不希望这样,请使用其他来源的哈希值。

    注意:在 Swift 3 中,indexOf 已变为 index(of:),因此对于此示例,我们将把 memes.indexOf(doge) 更改为 memes.index(of: doge)

    【讨论】:

      【解决方案2】:

      如果你想把比较放在 indexOf 方法本身,这样做:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多