2015-09-09 13 views
13

Ich verwende swift 2.0, ich habe ein Protokoll und eine Erweiterung auf dem Protokoll eine Standardimplementierung eines Verfahrens zu schaffen, wird der Code wie Brachen:Protokollerweiterung, Mutierende Funktion

protocol ColorImpressionableProtocol { 

    var lightAccentColor: UIColor? {get set} 
    var accentColor: UIColor? {get set} 
    var darkAccentColor: UIColor? {get set} 
    var specialTextColor: UIColor? {get set} 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

extension ColorImpressionableProtocol { 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?){ 
     lightAccentColor = impresion?.lightAccentColor 
     accentColor = impresion?.accentColor 
     darkAccentColor = impresion?.darkAccentColor 
     specialTextColor = impresion?.specialTextColor 
    } 
} 

Ich bin später in meinem Code versucht, diese Methode aufzurufen und eine Störung erhalte, der lautet:

„mutiert Mitglied verwenden, können nicht auf unveränderlichen Wert:‚selbst‘ist unveränderlich“

Der Code als Brachen ist:

init(impresion: ColorImpressionableProtocol?){ 
     super.init(nibName: nil, bundle: nil) 
     adoptColorsFromImpresion(impresion) 
} 

Das einzige, was mir einfällt ist, dass "Self" in diesem Fall ein Protokoll ist, keine Klasse. Allerdings muss mir etwas fehlen, damit dieses Konzept funktioniert. Eine Standardimplementierung einer Methode, die von einem Protokoll definiert wird, das Werte bearbeitet, die ebenfalls vom selben Protokoll definiert werden.

Vielen Dank für Ihre Hilfe und Zeit :)

Antwort

28

Wenn Sie das Protokoll zu verwenden, nur für die Klassen beabsichtigen, dann können Sie es ein Klasse Protokoll (und entfernen Sie das mutating Schlüsselwort) machen:

protocol ColorImpressionableProtocol : class { 

    // ... 

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

Dann

init(impresion: ColorImpressionableProtocol?){ 
    super.init(nibName: nil, bundle: nil) 
    adoptColorsFromImpresion(impresion) 
} 

kompiliert ohne Probleme.

+0

Ich glaube, das ist die richtige Syntax für das, was ich versuche, Perfecto! Vielen Dank – CWineland

+0

Ich muss dies um der Vernunft willen fragen ... was kann außer einer Klasse ein Protokoll implementieren, wogegen schützt das? Ich sehe nur kein anderes Ergebnis, aber eine Klasse, die damit konform ist – CWineland

+1

@Cwineland: Protokolle können auch durch eine Struktur implementiert werden. –

0

Die möglichen Lösungen sind:

1) eine nicht mutierende Version der Methode implementieren, wo das Protokoll angenommen. dh: Implementieren Sie die Methode, indem Sie die Klasse stattdessen als Protokollerweiterung übernehmen.

2) Machen Sie das Protokoll als Nur-Klasse-Protokoll.Wenn Ihr Protokoll nur die Klasse unterstützen muss, ist es die einfachste Lösung.

3) Stellen Sie sicher, dass nur Werttypen dieses Protokoll übernehmen. Dies ist möglicherweise in Szenarien nicht sinnvoll.

Here ist die detaillierte Erklärung und Lösung für diesen Fall.

+0

Bitte geben Sie diese Antwort im Kommentar ein –

Verwandte Themen