使用 Mirror
这是一个纯粹的Swift解决方案,但有一些限制:
protocol PropertyNames { func propertyNames() -> [String]}extension PropertyNames{ func propertyNames() -> [String] { return Mirror(reflecting: self).children.flatMap { $0.label } }}class Person : PropertyNames { var name = "Sansa Stark" var awesome = true}Person().propertyNames() // ["name", "awesome"]局限性:
- 返回Objective-C对象的空数组
将不返回计算的属性,即:
var favoriteFood: String { return "Lemon Cake" }如果
self
是类的实例(相对于结构),则不会报告其超类的属性,即:class Person : PropertyNames {var name = "Bruce Wayne"}
class Superhero : Person {
var hasSuperpowers = true
}Superhero().propertyNames() // [“hasSuperpowers”] — no “name”
您可以
superclassMirror()根据所需的行为来解决此问题。
使用 class_copyPropertyList
如果使用的是Objective-C对象,则可以使用以下方法:
var count = UInt32()let classToInspect = NSURL.selflet properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(classToInspect, &count)var propertyNames = [String]()let intCount = Int(count)for var i = 0; i < intCount; i++ { let property : objc_property_t = properties[i] guard let propertyName = NSString(UTF8String: property_getName(property)) as? String else { debugPrint("Couldn't unwrap property name for (property)") break } propertyNames.append(propertyName)}free(properties)print(propertyNames)到控制台的输出是否
classToInspect为
NSURL:
["pathComponents", "lastPathComponent", "pathExtension","URLByDeletingLastPathComponent", "URLByDeletingPathExtension","URLByStandardizingPath", "URLByResolvingSymlinksInPath","dataRepresentation", "absoluteString", "relativeString", "baseURL","absoluteURL", "scheme", "resourceSpecifier", "host", "port", "user","password", "path", "fragment", "parameterString", "query", "relativePath","hasDirectoryPath", "fileSystemRepresentation", "fileURL","standardizedURL", "filePathURL"]
这在操场上行不通。只需替换
NSURL为
EachDayCell(或重用与扩展相同的逻辑),它就可以工作。



