2016-09-06 25 views
5

Bir yapının tüm özellikleri üzerinde yineleme yapmak için basit bir yol var mı? Aşina olduğum statik olmayan özellikler için yaklaşım Mirror kullanıyor, ancak bu yapı yalnızca statik özellikler içerdiğinde boş bir dizi döndürüyor. İşte başarmak için çalışıyorum ne bir örnek:Bir yapının statik özellikleri üzerinde yineleme

struct Tree { 
    static let bark = "Bark" 
    static let roots = "Roots" 
} 

let treeParts = [String]() 
// insert code here to make treeParts = ["Bark", "Roots"] 
+0

Bunu denemedim, ancak yapının _instance_'ını veya metatype'u mı yansıtıyorsunuz? Tree.type'ı yansıtmak zorunda kalacağım statik özellikler elde etmeyi düşünüyorum. –

+0

.type ile kastettiğinizden emin değilim, yapmamın bu özelliği yok, ama ben de denedim. Kendim ve hiçbir şey almadım. – mattgabor

+0

Üzgünüz, doğru, 'Tree.self' (Ben sermaye-T "Tipini düşünüyordum, ama bu tipameame, metatype nesnesi değil) demeliydim. Çok işe yaramaz. –

cevap

0

Ben de aşağıdaki örneğe yapılan Bunun nasıl bir ilgi var beri. Neden sadece statik olmayan özelliklere sahip yapıyı ve yapının tekil olmasını sağlayan bir statik örnek değişkeni yaratmıyoruz. Aşağıdaki kod örneği, Person nesnesinin değerlerini REST API'sının adlandırma semantiği kullanılarak bir JSON sözlüğüne eşlemek için örnek kullanım durumunu gösterir. PersonJSONKeys mülk isimleri, Person'un mülkiyet isimleriyle eşleşmelidir.

allProperties() işlevinin kodu How to loop over struct properties in Swift?'dan gelir. Bu işlevi, yalnızca bir yapı özelliklerinin değerlerini döndürmek için kolayca değiştirebilirsiniz. Struct yana

struct PersonJSONKeys: PropertyLoopable { 
    static let instance: PersonJSONKeys = PersonJSONKeys() 
    private init() {} 

    let name = "name" 
    let firstName = "first_name" 
    let age = "age" 
} 

struct Person: PropertyLoopable { 
    let name = "Doe" 
    let firstName = "John" 
    let age = "18" 
} 

let person = Person() 
let personProperties = person.allProperties() 
var personJSON: [String:Any] = [:] 

for jsonProperty in PersonJSONKeys.instance.allProperties() { 
    let propertyName = jsonProperty.key 
    let jsonKey = jsonProperty.value as! String 
    personJSON[jsonKey] = personProperties[propertyName] 
} 

şimdi tüm özellikleri sadece bir kez başlatılacaktır bir tekil ve iplik güvenliği onun statik örnek değişkeni tarafından verilir.

İlgili konular