无法转换类型“Meme!”的值到预期的参数类型'@noescape (Meme) throws -> Bool'

Posted

技术标签:

【中文标题】无法转换类型“Meme!”的值到预期的参数类型\'@noescape (Meme) throws -> Bool\'【英文标题】: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

【问题讨论】:

【参考方案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)

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

【讨论】:

感谢大家的意见和帮助。我很感激时间和精力。如果您想查看,这是我的项目:github.com/pbellot77/MemeMe.git

以上是关于无法转换类型“Meme!”的值到预期的参数类型'@noescape (Meme) throws -> Bool'的主要内容,如果未能解决你的问题,请参考以下文章

无法转换类型“(_)-> Void?”的值到预期的参数类型'(() - > Void)?

无法转换“CGPoint!”类型的值到预期的参数类型'UnsafeMutablePointer<CGPoint>'

无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”

无法转换类型“Range<Int>?”的值到预期的参数类型'Range<String.Index>?

无法转换类型“[String]?”的值到预期的参数类型“字符串?”快速显示结构中的图像时

无法将类型“()”的值转换为预期的参数类型“字符串”