2014-07-15 9 views
6
class func getPropertiesInfo() -> (propertiesName:[String], propertiesType:[String]) { 
    var propertiesName:[String] = Array(); 
    var propertiesType:[String] = Array(); 

    var outCount:UInt32 = 0; 
    var i:Int  = Int(); 

    var properties:UnsafePointer<objc_property_t> = class_copyPropertyList(object_getClass(self), &outCount); 
    println("\(outCount)"); 
} 

tarafından hızlı kullanan bir sınıf özelliklerini alamayan:Ben kullanarak class_copyPropertyList

var infos = Model.getPropertiesInfo(); 
    println("names = \(infos.propertiesName)"); 
    println("types = \(infos.propertiesType)"); 

Model, benim özel sınıf olan özellikler name (String) ve age (int) sahiptir.

Ama hiçbir şey alamazsın

+0

P.S. Bir sınıf fonksiyonunda, 'self', çağrıldığı sınıftır. object_getClass (self) 'metaclassı alır. İstediğin bu mu? – newacct

cevap

2

Sen NSObject emin sınıf alt sınıfları yapmak, ya da (içten inanıyorum aynı yapar) sınıf adının önünde @objc eklemeniz gerekir.

class_copyPropertyList yöntemi yalnızca Swift sınıflarının türemediği NSObject alt sınıflarında çalışır.

+0

Çalışıyor! Benim hatam! object_getClass (AnyObject), bu annenin AnyObject'e ihtiyacı var, ama buna bir Sınıf adı geçiyorum, bu yüzden işe yaramıyor! – user3839355

+0

"inanıyorum aynı ben inanıyorum" Hayır yok. – newacct

+0

"Class_copyPropertyList yöntemi yalnızca NSObject alt sınıfları üzerinde çalışır" Nope, Objectice-C çalışma zamanı tüm Objective-C sınıflarında çalışır. Ayrıca, Objective-C Reaktif sınıflarını Objective-C çalışma zamanı işlevlerine bile geçirebilir ve yine de bazı bilgiler alabilirsiniz. – newacct

1

Swit 3 şekli

// convert to dictionary 
extension NSObject { 

    // dictionary 
    func toDictionary(from classType: NSObject.Type) -> [String: Any] { 

     var propertiesCount : CUnsignedInt = 0 
     let propertiesInAClass = class_copyPropertyList(classType, &propertiesCount) 
     let propertiesDictionary : NSMutableDictionary = NSMutableDictionary() 

     for i in 0 ..< Int(propertiesCount) { 
      let property = propertiesInAClass?[i] 
      let strKey = NSString(utf8String: property_getName(property)) as String? 
      if let key = strKey { 
       propertiesDictionary.setValue(self.value(forKey: key), forKey: key) 
      } 
     } 
     return propertiesDictionary as! [String : Any] 
    } 
} 

// call this for NSObject subclass 

let product = Product() 
let dict = product.toDictionary(from: Product.self) 
print(dict) 
İlgili konular