代码如下:
@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发布于 2015-10-06 00:13:35
该错误消息具有误导性。您实际需要的是为编译器提供一种比较两个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,并使用唯一的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(of:)__,因此在本例中,我们将memes.indexOf(doge)改为memes.index(of: doge)__。
发布于 2015-10-21 12:49:53
如果您希望将比较放在indexOf方法本身中,请执行以下操作:
if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})可能不是比较图像的最佳方式。如果您知道这些图像是同一个对象,则可以使用:
.indexOf({$0.memedImage == selectedMeme.memedImage})但是,如果您想逐个像素地比较它们,或者比较缩放到不同大小的同一图像,那就有点复杂了。
https://stackoverflow.com/questions/32952411
复制相似问题