Instance method 'METHOD' requires that 'CLASS' conform to 'PROTOCOL' problem

I’m trying to create a method to insert relationship into Core Data using Generics but I’ve problem with generics:
below there is the code that I’ve written.

Can you help me to fix it?

let lista = kanji.map{($0.kunYomi)} // let lista: [[KunYomi]]
let batchInsert2 = createBatchInsertRelationshipRequest(from: lista[0], for: KunYomi.self) // Here is the error Instance method 'createBatchInsertRelationshipRequest(from:for:)' requires that 'KunYomi' conform to 'BatchInsertable'


private func createBatchInsertRelationshipRequest<T:BatchInsertable, E:NSManagedObject>(from relationshipCollection:[T], for type:E.Type) -> NSBatchInsertRequest {
        var index = 0
        var total = relationshipCollection.count
        
        let batchInsertRequest = NSBatchInsertRequest(entity: E.entity(), dictionaryHandler: { dictionary in
            guard index < total else { return true }
            dictionary.addEntries(from: relationshipCollection[index].dictionaryValue as [AnyHashable: Any])
            index += 1
            return false
        })
        return batchInsertRequest
    }

public struct KunYomi:BatchInsertable{
    public let id:Int16
    public let kunYomiKanji:String
    public let kunYomiKana:String
    public let kunYomiRomaji:String
    public let kunYomiRomaji1:String
    public let idKanji:Int16
    
    enum CodingKeys:String, CodingKey{
        case id = "id"
        case kunYomiKanji   = "kun_yomi_kanji"
        case kunYomiKana    = "kun_yomi_kana"
        case kunYomiRomaji  = "kun_yomi_romaji"
        case kunYomiRomaji1 = "kun_yomi_romaji_1"
        case idKanji        = "id_kanji"
    }
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = Int16( try container.decode(String.self, forKey: .id)) ?? 0
        self.kunYomiKanji = try container.decode(String.self, forKey: .kunYomiKanji)
        self.kunYomiKana = try container.decode(String.self, forKey: .kunYomiKana)
        self.kunYomiRomaji = try container.decode(String.self, forKey: .kunYomiRomaji)
        self.kunYomiRomaji1 = try container.decode(String.self, forKey: .kunYomiRomaji1)
        self.idKanji = Int16( try container.decode(String.self, forKey: .idKanji)) ?? 0
    }
    
    var dictionaryValue: [String : Any] {
        ["id":id as Any,
         "kunYomiKanji":kunYomiKanji as Any,
         "kunYomiKana":kunYomiKana as Any,
         "kunYomiRomaji":kunYomiRomaji as Any,
         "kunYomiRomaji1":kunYomiRomaji1 as Any,
         "idKanji":idKanji as Any
        ]
    }
}

protocol BatchInsertable:Codable {
    var dictionaryValue:[String:Any] { get }
}

NY State of Health@rufy ,

The error you’re encountering arises because your createBatchInsertRelationshipRequest function requires the type parameter (in this case, KunYomi) to conform to the BatchInsertable protocol. However, your KunYomi struct doesn’t explicitly declare conformance to this protocol.

Make KunYomi conform to BatchInsertable. (Optional) Add an empty implementation for dictionaryValue in BatchInsertable
This is because the createBatchInsertRelationshipRequest function relies on the dictionaryValue property of the BatchInsertable protocol. Since KunYomi already defines this property, adding an empty implementation in the protocol itself is optional.

This topic was automatically closed after 166 days. New replies are no longer allowed.