2016-07-23 5 views
0

Ich habe einige Codes in Java, die gut organisiert, so dass es mir hilft, Quellcode zu verwalten sowie in Zukunft leicht zu erweitern. Diese Codes wie folgtWie schnell Quellcode in Muster zu organisieren?

public interface IDataModel<T extends IDataModel> { 
    void copyData(T data); 
    long getUpdatedTime(); 
} 


public abstract class AbstractDataModel<T extends IDataModel> implements IDataModel<T>{ 
    protected long updatedTime; 

    public long getUpdatedTime(){ 
    return updatedTime; 
    } 
} 

public class concreteDataA extends AbstractDataModel<concreteDataA>{ 
    String property1; 

    public String getProperty1(){ 
    return property1; 
    } 

    @override 
    public void copyData(concreteDataA data){ 
    property1 = data.getProperty1(); 
    updatedTime = data.getUpdatedTime(); 
    } 
} 

Jetzt möchte ich in iOS swift 3.0 portieren. Ist es möglich, Code in swift 3.0 wie oben zu organisieren? Oder gibt es einen gleichwertigen Weg, den Code wie oben zu organisieren? Ich bin ziemlich neu in Swift iOS, so dass es mir schwer macht, Quellcode in Pattern zu organisieren. Danke.

+0

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

+0

Was bedeutet "organisieren", Einrückung? Kontrolle + ich, in Xcode wird Ihren Code richtig einrücken. – Idan

+0

Vielen Dank @Sulthan, können Sie mir bitte ein Beispielcode in swift geben, das Äquivalent wie oben? – MichaelP

Antwort

2

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.