Sie haben nicht viel im Kontext bereitgestellt, aber es scheint, als ob Sie Schwierigkeiten haben, eine "Protokoll-orientierte" Lösung zu entwickeln, wie Swift-Leute das Muster gerne nennen. Hier sind ein paar Optionen, die Ihr Problem lösen könnte (Spoiler - ich denke, das Problem in Ihrem Design ist):
Schnittstelle: Protokoll, Abstrakte Klasse: Protokollerweiterung
Wie @sulthan erwähnt, können Sie sicher bekommen ein ähnlicher Ort Protokolle mit Standardimplementierungen verwenden, etwa so:
protocol DataModel {
mutating func copy(data: Self)
var updatedTime : Float { get }
}
extension DataModel {
var updatedTime : Float { return 0 }
}
Allerdings werden Sie auf ein Problem stoßen, wenn Sie versuchen, die ConcreteDataModel
zu implementieren, da Sie es zu berücksichtigen, für den property1
Wert spezialisieren wollen, dass ‚isn t im Protokoll erwähnt. Ihre Optionen sind, diese Anforderung in ConcreteDataModel
zu entspannen (aka tun Sie das nicht) oder typecasting zu verwenden. Bitte beachten Sie, die Bekämpfung des Schreibsystems in Swift ist ein sicheres Zeichen dafür, dass Ihr Code nicht idiomatisch ist! Sie sollten diese Schwierigkeit als die Sprache sehen, die Sie dazu bringt, Ihren Ansatz zu überdenken.
Verwendung unveränderliche Datentypen
Dies ist die Straight-Forward-Antwort. Wenn das, was Sie oben beschrieben haben, ein konkretes Beispiel aus Ihrer App ist, dann brauchen Sie überhaupt keine Protokolle. (Tatsächlich ist Ihre Java-Implementierung sicherlich übermäßig abstrakt.) Swift struct
s sind unveränderlich, was bedeutet, dass Sie, wenn Sie sie ändern, tatsächlich eine Kopie ändern.
struct DataModel {
let updatedTime: Float
mutating func update(time: Float) {
self = DataModel(updatedTime: time)
}
}
var data1 = DataModel(updatedTime: 3)
var data2 = data1
data2.update(time: 17)
print(data1.updatedTime) // 3.0
print(data2.updatedTime) // 17.0
Modell Ihres Verhalten abgesehen von Ihren Daten
Dies ist das verallgemeinerte Lösung. Aus der Sicht des Designs ist klar, dass Sie zwei unterschiedliche Probleme haben. Sie wollen etwas kopierbar, und Sie wollen etwas, das "Zeit" verfolgt. Warum lässt du deinen Code nicht einfach so wiedergeben?
protocol Copier {
associatedtype Data
func copy(from: Data) -> Data
}
protocol Clock {
var time: Float { get }
}
class AlarmClock: Clock, Copier {
let time: Float
let alarm: Float
init(time: Float, alarm: Float) {
self.time = time
self.alarm = alarm
}
func copy(from: AlarmClock) -> AlarmClock {
return AlarmClock(time: from.time, alarm: from.alarm)
}
}
Natürlich könnte man auch den letzten Schritt gehen und die Standardimplementierung für Clock.time
geben, wenn Sie es wirklich benötigt wird.
Ja, es ist möglich, aber im Allgemeinen Swift hat viel bessere Möglichkeiten, um Code zu organisieren als Java, vor allem wegen Erweiterungen und bessere Abstraktion mit Protokollen. Sie können keine abstrakte Klasse erstellen, aber Sie können eine Standardimplementierung für Protokollmethoden hinzufügen. – Sulthan
Was bedeutet "organisieren", Einrückung? Kontrolle + ich, in Xcode wird Ihren Code richtig einrücken. – Idan
Vielen Dank @Sulthan, können Sie mir bitte ein Beispielcode in swift geben, das Äquivalent wie oben? – MichaelP