2016-03-18 7 views
3

Swiftを使用して多数の構造体を作成しています。これらの構造体はすべて同じパターンに従います。それぞれの構造体にはgetterとsetterを持つ多数の計算されたプロパティが含まれていますが、各構造型の唯一の違いは計算されたプロパティの数とそれぞれの名前と型です。例えば、関数を使用してSwiftで構造体プロパティを定義する

struct Employee 
{ 
    var title: String 
    { 
     get { /*...*/ return someDict["title"] as! String } 
     set { /*...*/ } 
    } 
    var id: Int 
    { 
     get { /*...*/ return someDict["id"] as! Int } 
     set { /*...*/ } 
    } 
    var salary: Double 
    { 
     get { /*...*/ return someDict["salary"] as! Double } 
     set { /*...*/ } 
    } 
} 

struct Student 
{ 
    var name: String 
    { 
     get { /*...*/ return someDict["name"] as! String } 
     set { /*...*/ } 
    } 
    var gpa: Double 
    { 
     get { /*...*/ return someDict["gpa"] as! Double } 
     set { /*...*/ } 
    } 
} 

すぐ、ゲッターとセッターの各々はかなり同じ異なる構造体を横切っている、唯一の違いは、それぞれが計算されたプロパティ名のハードコードされた文字列表現に、そのタイプを指すことにあります。

これは厄介で反復的です。構造体を一見するだけでは、その構造体に含まれるプロパティーと繰り返しコードが多く含まれていることを確認するのは難しいです。私は、必要なプロパティを持つプロトコルを作成し、構造体に採用することを考えました。少なくとも、プロトコルは読みやすくなりますが、繰り返しコードの問題は解決しません。私は何をしたいのは、その後、各構造体がはるかに読みやすいかもしれないと

、のようなはるかに少ない繰り返しコード、そこだろう

#define PROPERTY(NAME, TYPE) var NAME: TYPE { get{...} set{...} } 

、のような、これらのプロパティを定義するマクロのようなものを定義しています

struct Employee 
{ 
    PROPERTY(title, String) 
    PROPERTY(id, Int) 
    PROPERTY(salary, Double) 
} 

struct Student 
{ 
    PROPERTY(name, String) 
    PROPERTY(gpa, Double) 
} 

スウィフトでこのようなことをする方法はありますか?それとも、私が検討すべきより良いアプローチがありますか? Linux(不完全なFoundation)で動作しているので、純粋なSwiftソリューションが欲しいです。

+0

プリプロセッサマクロソリューションはありません。この種の詐欺はSwiftから排除されました。価値のあるものは、コードジェネレーターを書くことです。 – nhgrif

+0

おそらくあなたはあなたの問題に間違った解決策を考え出していると思います。多くの構造体が必要な場合は、代替のソリューションがあるかもしれないことをお勧めします。 –

+0

私はそれが本当に@TobyAllenだとは思わない。よく整理されたモデルレイヤーに問題はありません。しかし、これは確かにXYの問題のビットかもしれません。 – nhgrif

答えて

1

私が考え出すことができる最良のアプローチは、入力としていくつかの種類の単純化されたテンプレートを取り、プリコンパイルビルドフェーズとして実行される.swiftファイルを吐き出す外部スクリプトを作成することです。以下のような何か:

Input.notswift: 

extension Employee { 
    PROPERTY(title, String, "title") 
} 

してから実行してプリコンパイルビルドフェーズとして、(何かのような、エスケープ処理はすべて間違っている):手動でInput.notswift上のC-プリプロセッサを実行することができ、また

sed s/PROPERTY\(([^,]*), ([^,]*), ([^,]*)\)/var NAME: TYPE { get{...} set{...} }/ <Input.notswift> Properties.swift 

Input.swiftを生成する。前処理アプローチをとることに決めたら、.notswiftから.swiftを生成するために使用できるメカニズムの無限リストがあります。

+0

ありがとう、私はこれのような何かが最もクリーンな方法かもしれないと恐れていた – Philip

関連する問題