web-dev-qa-db-ja.com

タイプ「ミーム!」の値を変換できません期待される引数型 '@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に変換できません

ミーム!私のアプリの構造体です。これをどのように処理しますか?

_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
_
27
Patrick.Bellot

エラーメッセージは誤解を招くです。実際に必要なのは、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、では、indexOfindex(of:)になっているため、この例ではmemes.indexOf(doge)memes.index(of: doge)

44
ayaio

比較をindexOfメソッド自体の内部に置きたい場合は、次のようにします。

if let foundIndex = MemeRepository.sharedInstance.memes.indexOf({
  UIImagePNGRepresentation($0.memedImage) == UIImagePNGRepresentation(selectedMeme.memedImage)})

おそらく画像を比較するための最良の方法ではありません。画像が同じオブジェクトであることがわかっている場合は、以下を使用できます。

.indexOf({$0.memedImage == selectedMeme.memedImage})

しかし、それらをピクセルごとに比較したり、同じ画像を異なるサイズに拡大縮小して比較したりする場合は、少し複雑になります。

5
Millie H.