2017-07-31 2 views
0

je protocole de cadreProtocole de classe: ne peut pas utiliser membre muter sur la valeur immuable: « soi » est immuable

public protocol BaseMappable { 
    /// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process. 
    mutating func mapping(map: Map) 
} 

et j'ai mon protocole avec extension (implémentation par défaut)

public protocol DtoResponseRequestActionable: class { 
    func transferToResponceAction(_ dto: TransferToResponce) 
} 

extension DtoResponseRequestActionable where Self: BaseMappable { 

    func transferToResponceAction(_ dto: TransferToResponce) { 
     var map = Map(mappingType: .toJSON, JSON: [:]) 
     dto.transfering(map: map) 
     let json = map.JSON 
     map = Map(mappingType: .fromJSON, JSON: json) 
     mapping(map: map) // <<< ERROR 
    } 

} 

mais J'ai une erreur

Impossible d'utiliser un membre en mutation sur une valeur immuable: 'self' est immuable

Comment je peux le réparer, par défaut imp. Si je copie/colle le code de l'extension à chaque classe, cela fonctionne bien, mais j'ai besoin d'un défaut par défaut. Des solutions?

Répondre

0

Vous appelez une méthode de mutation à partir d'une méthode non-mutante. Pour transferToResponceAction d'appeler mapping, il doit également être marqué mutating.

+0

'virus' est pas valable sur les méthodes de classes ou protocoles liés à une classe –

+0

Swift ne peut pas gérer les exigences de classe de mélange de cette façon. Vous devrez déplacer l'exigence 'class' vers' BaseMappable'. Le fait que vous ayez marqué 'where Self: BaseMappable' ne prolonge pas suffisamment la" classe-ness ". Vous devez soit marquer cette fonction 'mutating', soit supprimer' mutating' de 'mapping'. Vous devez donc supprimer 'class' ou l'agrandir. Ce n'est pas pour des raisons profondes et intentionnelles. Swift ne peut tout simplement pas le faire. –

+0

Pour plus d'informations sur cette erreur, voir https://www.bignerdranch.com/blog/protocol-oriented-problems-and-the-immutable-self-error/ –

0

Cela pourrait aider

public protocol BaseMappable : class { 
    /// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process. 
    func mapping(map: Map) 
} 

L'autre façon serait de supprimer la classe de

public protocol DtoResponseRequestActionable { 
    mutating func transferToResponceAction(_ dto: TransferToResponce) 
} 

et ajouter à muter

mutating func transferToResponceAction(_ dto: TransferToResponce) { 
+0

protocole public 'BaseMappable' est ** protocole de l'infrastructure **, je ne peux pas changer de cadre –