2016-07-23 5 views
0

私はよく整理されたjavaでいくつかのコードを持っているので、私はソースコードを管理するだけでなく、今後も簡単に拡張できます。以下のコードは、次のとおりです。パターンで素早くソースコードを整理するには?

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(); 
    } 
} 

iOS swift 3.0に移植します。上記のようにswift 3.0でコードを整理することは可能ですか?または上記のようにコードを整理するための迅速な手段がありますか?私はiOSをすばやく始めたので、パターンでソースコードを整理するのが難しくなります。ありがとうございます。

+0

はい、可能ですが、一般的に、SwiftにはJavaよりもコードを整理するための方がはるかに優れています。これは、主に拡張機能とプロトコルを使用した抽象度が高いためです。抽象クラスは作成できませんが、プロトコルメソッドのデフォルト実装を追加できます。 – Sulthan

+0

「整理」、字下げとはどういう意味ですか? Xcodeでcontrol + iを押すとコードが正しくインデントされます。 – Idan

+0

@Sulthanありがとうございます、上記のような同等の迅速なコードのサンプルを教えてください。 – MichaelP

答えて

2

あなたは文脈の形をあまり提供していませんが、Swiftの人々がパターンを呼びたいのと同じように、「プロトコル指向の」ソリューションの開発に苦労しているようです。ここにあなたの問題を解決する可能性がありますオプションのカップル(スポイラー - 私は問題があなたのデザインであると思います)、次のとおりです。

インタフェース:プロトコル、抽象クラス:プロトコル拡張

が述べた@sulthanと同じように、あなたは確かに得ることができますそのようなデフォルトの実装とプロトコルを使用して、同様の場所、:あなたは「にISN property1値を考慮して、それを専門にしたいので、ConcreteDataModelを実装しようとすると、しかし

protocol DataModel { 
    mutating func copy(data: Self) 
    var updatedTime : Float { get } 
} 

extension DataModel { 
    var updatedTime : Float { return 0 } 
} 

は、あなたが問題に実行されますプロトコルに言及されている。あなたの選択肢は、ConcreteDataModelの要件を緩和する(別名ではない)か、型キャスティングを使用することです。 に注意してください。Swiftのタイピングシステムと戦うことは、あなたのコードが慣習ではないという確かな兆候です!あなたは、あなたのアプローチを再考するための言語として、この難しさを見なければなりません。

利用不変のデータ型

これは最も直接的な答えです。上で説明したことが実際にあなたのアプリの具体的な例であれば、プロトコルはまったく必要ありません。実際、あなたのJava実装は確かに過度に抽象化されています。Swift structは変更不可能です。つまり、変更するたびに実際にコピーが変更されます。

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 
モデルあなたの行動離れてあなたのデータから

これは一般的なソリューションです。デザインの観点からは、2つの明確な懸念があることは明らかです。あなたは何かをコピー可能にしたいと思っています。あなたは「時間」を追うものを求めています。なぜあなたのコードにそれを反映させるだけではないのですか?

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) 
    } 
} 

もちろん、あなたも、最後のステップに行くことができ、あなたが本当にそれを必要に応じてClock.timeのデフォルトの実装を提供します。

関連する問題