Hier ist ein einfaches Spielplatz Beispiel:Umgebung lassen Argumente in Swift
class Foobar {
var name = ""
init(name:String) {
self.name = name
}
func modifyName(modification:String) {
self.name += modification
}
}
let list = [Foobar(name:"I"), Foobar(name:"Me"), Foobar(name:"Myself")]
for each in list {
each.modifyName(" rules")
}
Eine Klasse mit name
Variable und eine einzige Funktion, die diese Variable ändern können. Machen Sie eine Liste von ihnen, benutzen Sie jetzt einen for in
, um die modifizierende Funktion auszuüben.
ABER.
class Foobar {
var name = ""
init(name:String) {
self.name = name
}
}
protocol Modifiable {
var name:String { get set }
}
extension Modifiable {
mutating func modifyName(modification:String) {
self.name += modification
}
}
extension Foobar:Modifiable { }
Dann wird die for in
werden nicht mehr funktionieren, weil die Modifiable
Erweiterung mit Anmerkungen versehen notwendig, um die modifyName
als mutating
: Wenn ich die modifyName Variable in eine Protokollerweiterung Refactoring. Der ausgegebene Fehler ist error: cannot use mutating member on immutable value: 'each' is a 'let' constant
. Es gibt eine einfache Abhilfe, aber es fühlt sich an wie ich etwas zu missbrauchen:
for each in list {
var each = each
each.modifyName(" rules")
}
ich das gleiche Problem mit Funktionen gehabt haben, die ein Argument haben, das mit Anmerkungen versehen getaggt wurde. Früher konnten Sie diese Parameter mit var
in der arg-Liste markieren, aber das ist in den neuesten Versionen von swift veraltet. Dieselbe Ein-Zeilen-Problemumgehung funktioniert dort. Gibt es einen besseren idiomatischen Weg, dies zu tun? Was ursprünglich damit anfing, war das einfache Extrahieren eines gemeinsamen Verhaltens in Protokollerweiterungen anstelle eines Vererbungsbaums. Es fühlt sich an, als würde ich eine Strafe für diese Wahl bezahlen.
Ich wusste nicht über den Modifikator 'class' für Protokolldeklarationen. Das hilft Tonnen, danke! –