一尘不染

迅速列出课程属性

swift

注:有帐目标下用一个类似的问题在这里,但我想实现它迅速。

我有一个这样迅速宣布的课程:

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。

我该如何实现?


阅读 245

收藏
2020-07-07

共1个答案

一尘不染

使用 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.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)

到控制台的输出是否classToInspectNSURL

["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"]

这在操场上行不通。只需替换NSURLEachDayCell(或重用与扩展相同的逻辑),它就可以工作。

2020-07-07