これがコードです:
_ @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
に変換できません
ミーム!私のアプリの構造体です。これをどのように処理しますか?
_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
_
エラーメッセージは誤解を招くです。実際に必要なのは、2つのMeme
インスタンスを比較し、それらのインスタンスが等しい基準を決定する方法をコンパイラーに提供することです。
同じname
プロパティを持つ2つのインスタンスを等しいものとして処理したいとします。
構造体をEquatable
に準拠させるとともに、2つの構造体を名前プロパティで比較する_==
_演算子を作成します。
_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
}
_
2つのインスタンスを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の2つの異なるインスタンスは等しいと見なされます。それが必要ない場合は、ハッシュ値に別のソースを使用してください。
注:Swift 3、では、indexOf
がindex(of:)
になっているため、この例ではmemes.indexOf(doge)
をmemes.index(of: doge)
。
比較をindexOfメソッド自体の内部に置きたい場合は、次のようにします。
if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})
おそらく画像を比較するための最良の方法ではありません。画像が同じオブジェクトであることがわかっている場合は、以下を使用できます。
.indexOf({$0.memedImage == selectedMeme.memedImage})
しかし、それらをピクセルごとに比較したり、同じ画像を異なるサイズに拡大縮小して比較したりする場合は、少し複雑になります。