首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法转换'Meme!‘类型的值到预期的参数类型“@noescape (Meme)抛出->布尔值”

无法转换'Meme!‘类型的值到预期的参数类型“@noescape (Meme)抛出->布尔值”
EN

Stack Overflow用户
提问于 2015-10-05 23:34:50
回答 2查看 9.5K关注 0票数 27

代码如下:

代码语言:javascript
复制
    @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

迷因!是我的应用程序的结构。我该如何解决这个问题呢?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2015-10-06 00:13:35

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

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

我们使结构符合Equatable,并且我们还创建了一个==操作符,该操作符通过两个结构的名称属性来比较它们:

代码语言:javascript
复制
struct Meme:Equatable {
    var name:String!
}

func ==(lhs: Meme, rhs: Meme) -> Bool {
    return lhs.name == rhs.name
}

现在我们可以将indexOf与Meme实例一起使用:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)__。

票数 44
EN

Stack Overflow用户

发布于 2015-10-21 12:49:53

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

代码语言:javascript
复制
if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
  UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})

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

代码语言:javascript
复制
.indexOf({$0.memedImage == selectedMeme.memedImage})

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32952411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档