Swift

2016-03-18 16 views
3

'daki yapı özelliklerini tanımlamak için işlevi kullanın. Swift'i çok sayıda yapı oluşturmak için kullanıyorum; bunların tümü çoğunlukla aynı kalıptan oluşuyor. Her bir yapı, alıcılar ve ayarlayıcılarla bir dizi hesaplanmış özellik içerir; her bir yapı tipi arasındaki tek fark, hesaplanan özelliklerin sayısı ve her birinin adı ve türüdir. Örneğin, Şimdi 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 { /*...*/ } 
    } 
} 

, Alıcı ve ayarlayıcıların her tek fark her bilgisayarlı özellik adının kodlanmış dize gösterimine ve türünün gönderme yaptığı olmak farklı yapılar arasında hemen hemen aynıdır .

Bu bir çeşit hantal ve tekrarlayıcıdır. Yapıya bakmak ve hangi özellikleri içerdiğini görmek ve tekrarlanan kodların çoğunu kullanmak zordur. Gerekli özelliklere sahip bir protokol oluşturmayı ve yapıda benimsemeyi düşündüğümden, en azından protokolün daha kolay okunabileceğini, ancak tekrarlanan kod sorununu çözmediğini düşündüm. Ne yapmak istiyorum

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

Daha sonra her yapı çok daha okunabilir olabilir ve, gibi çok daha az tekrarlanan kod olurdu, gibi bu özellikleri tanımlayan bir makro gibi bir şey tanımlamak olduğu

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

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

Swift'de böyle bir şeyi yapmanın bir yolu var mı? Yoksa düşünmem gereken daha iyi bir yaklaşım var mı? Linux'ta çalıştığı kadar saf bir Swift çözümü istiyorum (eksik vakıf).

+0

Kesinlikle bir önişlemci makro çözümü yoktur. Bu tür şantajlar Swift'den yok edildi. Değerli olan bir kod üreteci yazmaktır. – nhgrif

+0

Sanırım sorununun yanlış çözümü ile geliyorsunuzdur. Eğer bu çok sayıda yapıya ihtiyacınız varsa alternatif bir çözüm önerebilirim. –

+0

Bu kesinlikle doğru olduğunu düşünmüyorum @TobyAllen. İyi organize edilmiş bir model katmanında yanlış bir şey yok. Yine de, bu aslında bir XY problemi olabilir. – nhgrif

cevap

1

En iyi yaklaşım, bir çeşit basitleştirilmiş şablon girdisi alır ve bir .swift dosyasını harcayan bir dış komut dosyası oluşturmaktır. Bir şey gibi:

Input.notswift: 

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

ve sonra çalıştırın ön derleme inşa aşaması olarak (bir şey gibi kaçış tamamen yanlış): manuel Input.notswift C-önişlemci çalıştırabilir, Alternatif

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

Input.swift oluşturmak için. Ön işleme yaklaşımını kullanmaya karar verdiğinizde .notswift'den .swift oluşturmak için kullanabileceğiniz sonsuz sayıda mekanizma vardır.

+0

Teşekkürler, böyle bir şeyin en temiz yolu olabileceğinden korktum – Philip