Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to get list of variables and function of a class

Tags:

xcode

swift

Is there a way to get list of variables and function of a class?

For example: If my class is like below

class Person {
    var age: Int!
    var name: String! 
    func isOlder(from person: Person) -> Bool { }
    func hasSameName(as person: Person) -> Bool { }
}

I want to get 2 lists:

1. [age, name]
2. [isOlder( _ : ), hasSameName( _ : )]

Or something similar.

Thanks

like image 741
ilan Avatar asked Jun 21 '17 08:06

ilan


People also ask

How do I get list of methods in a Python class?

To list the methods for this class, one approach is to use the dir() function in Python. The dir() function will return all functions and properties of the class.


2 Answers

I believe you can use Mirror API for this: https://developer.apple.com/documentation/swift/mirror

New key-path API in Swift 4 might also be helpful: https://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md

like image 102
Göksel Köksal Avatar answered Sep 27 '22 21:09

Göksel Köksal


Swift 4:

func printMethodNamesForClass(cls: AnyClass) {
    var methodCount: UInt32 = 0
    let methodList = class_copyMethodList(cls, &methodCount)
    if let methodList = methodList, methodCount > 0 {
        enumerateCArray(array: methodList, count: methodCount) { i, m in
            let name = methodName(m: m) ?? "unknown"
            print("#\(i): \(name)")
        }

        free(methodList)
    }
}
func enumerateCArray<T>(array: UnsafePointer<T>, count: UInt32, f: (UInt32, T) -> Void) {
    var ptr = array
    for i in 0..<count {
        f(i, ptr.pointee)
        ptr = ptr.successor()
    }
}
func methodName(m: Method) -> String? {
    let sel = method_getName(m)
    let nameCString = sel_getName(sel)
    return String(cString: nameCString)
}
func printMethodNamesForClassNamed(classname: String) {
    // NSClassFromString() is declared to return AnyClass!, but should be AnyClass?
    let maybeClass: AnyClass? = NSClassFromString(classname)
    if let cls: AnyClass = maybeClass {
        printMethodNamesForClass(cls: cls)
    } else {
        print("\(classname): no such class")
    }
}
like image 35
Anton Plebanovich Avatar answered Sep 27 '22 19:09

Anton Plebanovich