gpt4 book ai didi

ios - 如何检查(反射)属性是否是数组(任何类型)?

转载 作者:行者123 更新时间:2023-11-30 14:03:51 24 4
gpt4 key购买 nike

如何检查属性是否为 Array (任何类型)?此代码始终只打印“Worker”。有没有办法(动态地)知道一个属性是否是 Array不告知类型?

final class Worker: NSObject {

var id: Int?
var array: Array<Worker>?

}


class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let worker = Worker()
worker.id = Int(2) as Int?
worker.array = [Worker(),Worker(),Worker()]

let mirror = reflect(worker)

for i in 0..<mirror.count {

let (name, childMirror) = mirror[i]

if childMirror.disposition == .Optional {

let (newName,subChildMirror) = childMirror[0]

if subChildMirror.valueType is Array<AnyClass>.Type {
println("AnyClass")
}
if subChildMirror.valueType is Array<AnyObject>.Type {
println("AnyObject")
}
if subChildMirror.valueType is Array<Any>.Type {
println("Any")
}
if subChildMirror.valueType is Array<NSObject>.Type {
println("NSObject")
}
if subChildMirror.valueType is Array<Worker>.Type {
println("Worker")
}

}

}

}
}

PS:我需要处理Array<>

最佳答案

任何类型的数组都可以转换为 NSArray。因此,您可以使用如下代码检查它是否是一个数组:

if _ = subChildMirror.valueType as? NSArray {
println("Array")
}

还可以动态获取该数组的对象类型。在我的EVReflection图书馆我做了类似的事情。我扩展了数组,以便获取该数组中应该包含的对象的新元素。在您的情况下,您可以从 dat 对象获取 .dynamicType。

所以代码将变成:

let arrayType = worker.array.getTypeInstance().dynamicType

这是数组扩展

extension Array {
/**
Get the type of the object where this array is for

:returns: The object type
*/
public func getTypeInstance<T>(
) -> T {
let nsobjectype : NSObject.Type = T.self as! NSObject.Type
let nsobject: NSObject = nsobjectype.init()
return nsobject as! T
}
}

关于ios - 如何检查(反射)属性是否是数组(任何类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637596/

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