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

时间:2015-09-17 18:32:15

标签: ios arrays swift reflection

如何检查属性是Started GET "/admin/show_requests" for 127.0.0.1 at 2015-09-18 09:35:36 -0400 Processing by Admin::ShowRequestsController#index as HTML AdminUser Load (0.3ms) SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = 1 ORDER BY "admin_users"."id" ASC LIMIT 1 (1.2ms) SELECT COUNT(*) FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') (0.2ms) SELECT COUNT(*) FROM "show_requests" (0.2ms) SELECT COUNT(*) FROM "show_requests" WHERE (not_going_to_show = 't' AND i_want_my_horse_to_compete = 'f') (0.3ms) SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count CACHE (0.0ms) SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count CACHE (0.0ms) SELECT COUNT(*) FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') CACHE (0.0ms) SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') LIMIT 30 OFFSET 0) subquery_for_count ShowRequest Load (2.0ms) SELECT "show_requests".* FROM "show_requests" WHERE (not_going_to_show = 'f' OR i_want_my_horse_to_compete = 't') ORDER BY "show_requests"."id" desc LIMIT 30 OFFSET 0 Show Load (9.7ms) SELECT "shows".* FROM "shows" WHERE "shows"."id" IN (2, 1) User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 2]] User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] Show Load (0.2ms) SELECT "shows".* FROM "shows" User Load (0.2ms) SELECT "users".* FROM "users" (任何类型)?此代码始终只打印“Worker”。有没有办法(动态地)知道某个属性是Array而不通知该类型?

Array

Ps。:我需要处理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") } } } } }

1 个答案:

答案 0 :(得分:0)

任何类型的数组总是可以转换为NSArray。所以你可以检查它是否是一个包含这样代码的数组:

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

还可以动态获取该数组的对象类型。在我的EVReflection库中,我做了类似的事情。我扩展了Array以获取对象的新元素应该在该Array中。在您的情况下,您可以从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
    }
}