gpt4 book ai didi

class - swift 类的属性列表

转载 作者:IT王子 更新时间:2023-10-29 05:01:19 24 4
gpt4 key购买 nike

注意:在 here 上针对 objective-c 发布了一个类似的问题。 ,但我想快速实现它。

我有一个像这样在 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。

我怎样才能做到这一点?

最佳答案

使用镜像

这是一个有一些限制的纯 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 是类的实例(相对于结构),这不会报告其父类(super class)的属性,即:

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

这在 Playground 上行不通。只需将 NSURL 替换为 EachDayCell(或重用与扩展相同的逻辑),它应该可以工作。

关于class - swift 类的属性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com