注:有帐目标下用一个类似的问题在这里,但我想实现它迅速。
我有一个这样迅速宣布的课程:
import UIKit class EachDayCell : UITableViewCell { @IBOutlet var dateDisplayLabel : UITextField @IBOutlet var nameDisplayLabel : UITextField @IBAction func goToPendingItems(sender : AnyObject) { } @IBAction func showDateSelectionPicker(sender : AnyObject) { } init(style: UITableViewCellStyle, reuseIdentifier: String!) { super.init(style: style, reuseIdentifier: reuseIdentifier) } }
现在,我想快速注册一个数组:dateDisplayLabel,nameDisplayLabel。
我该如何实现?
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"]
局限性:
将不返回计算的属性,即:
var favoriteFood: String { return "Lemon Cake" }
如果self是类的实例(相对于结构),则不会报告其超类的属性,即:
self
class Person : PropertyNames { var name = "Bruce Wayne"
}
class Superhero : Person { var hasSuperpowers = true }
Superhero().propertyNames() // [“hasSuperpowers”] — no “name”
您可以superclassMirror()根据所需的行为来解决此问题。
superclassMirror()
class_copyPropertyList
如果使用的是Objective-C对象,则可以使用以下方法:
var count = UInt32() let classToInspect = NSURL.self let 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:
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(或重用与扩展相同的逻辑),它就可以工作。
EachDayCell