测试变量是否在Swift中的类中声明

时间:2014-08-26 09:11:15

标签: swift

我正在尝试做这样的事情。我想测试一个类是否有一个给定名称的变量。

if(classInstance.hasProperty(test))

在示例中,我想测试test命名变量是否是该类的成员。我有什么方法可以做到吗?

2 个答案:

答案 0 :(得分:2)

目前还没有一种纯粹的 Swift 方法(reflect还不够),也许objc运行时方法可以提供帮助。使用class_copyIvarList

func hasProperty (obj: AnyObject, property: String) -> Bool {

    var count: UInt32 = 0
    var ivars: UnsafeMutablePointer<Ivar> = class_copyIvarList(obj.dynamicType, &count)

    for i in 0..<count {
        let name = NSString(CString: ivar_getName(ivars[Int(i)]), encoding: NSUTF8StringEncoding)
        if name == property {
            return true
        }
    }

    return false
}

用法:

public class R {
    private var aVar = "Hi"
    private var anotherVar: Int = 0
}

hasProperty(R(), "anotherVar") // outputs true

答案 1 :(得分:2)

@ pNre解决方案的修改版本,没有遍历所有ivars:

func hasProperty (obj: AnyObject, property: String) -> Bool {
  return property.withCString {
    class_getInstanceVariable(obj.dynamicType, $0) != nil
  }
}