无法转换类型“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
在此示例中,hashValue
由 self.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>?