这里是代码:
@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)。