数组 – 无法转换类型’Meme!’的值到期望的参数类型’@noescape(Meme)throws – > Bool’

前端之家收集整理的这篇文章主要介绍了数组 – 无法转换类型’Meme!’的值到期望的参数类型’@noescape(Meme)throws – > Bool’前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这里是代码
@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方法(selectedMeme)。

无法转换类型Meme的值!到期望的参数类型@noescape(Meme)throws – > Bool

Meme!是我的应用程序的结构。我如何通过这个工作?

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
错误消息具有误导性。你实际需要的是为编译器提供一种比较两个Meme实例并决定这些实例是相等的标准的方法

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

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

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的索引,因此对于这个例子,我们将memes.indexOf(doge)更改为memes.index(of:doge)。

猜你在找的Swift相关文章