Here's a clean Swift solution with Swift 3:
var numClasses: Int32 = 0 var allClasses: AutoreleasingUnsafeMutablePointer<AnyClass?>? = nil defer { allClasses = nil } numClasses = objc_getClassList(nil, 0) if numClasses > 0 { var ptr = UnsafeMutablePointer<AnyClass?>.allocate(capacity: Int(numClasses)) defer { ptr.deinitialize() ptr.deallocate(capacity: Int(numClasses)) } allClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>(ptr) numClasses = objc_getClassList(allClasses, numClasses) for i in 0 ..< numClasses { if let currentClass: AnyClass = allClasses?[Int(i)] { print("\(currentClass)") } } }
Original solution with Swift 2.2 / Xcode 7.3:
var numClasses: Int32 = 0 var allClasses: AutoreleasingUnsafeMutablePointer<AnyClass?> = nil defer { allClasses = nil } numClasses = objc_getClassList(nil, 0) if numClasses > 0 { var ptr = UnsafeMutablePointer<AnyClass>.alloc(Int(numClasses)) defer { ptr.destroy() ptr.dealloc(Int(numClasses)) ptr = nil } allClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>.init(ptr) numClasses = objc_getClassList(allClasses, numClasses) for i in 0 ..< numClasses { if let currentClass: AnyClass = allClasses[Int(i)] { print("\(currentClass)") } } }
Note that due to Swift handling weak pointers (protip: it is not), your classes will be overridden by this code. I opened SR-1068 about binding __weak and __unsafe_unretained to Swift. __weak pointers join as UnsafeMutablePointer , while __unsafe_unretained pointers join as AutoreleasingUnsafeMutablePointer , which causes excessive binding.
Fortunately, Classes do nothing in the version , so this code is relatively safe, at least for now.
source share