Swift class introspection & generics

introspection, swift

Solution

Well, for one, the Swift equivalent of `[NSString class]` is `.self` (see Metatype docs, though they're pretty thin).

In fact, `NSString.class` doesn't even work! You have to use `NSString.self`.

let s = NSString.self
var str = s()
str = "asdf"

Similarly, with a swift class I tried...

class MyClass {

}

let MyClassRef = MyClass.self

// ERROR :(
let my_obj = MyClassRef()

Hmm… the error says:

Playground execution failed: error: :16:1: error: constructing an object of class type 'X' with a metatype value requires an '@required' initializer

 Y().me()
 ^
 <REPL>:3:7: note: selected implicit initializer with type '()'
 class X {
       ^

It took me a while to figure out what this means… turns out it wants the class to have a `@required init()`

class X {
    func me() {
        println("asdf")
    }

    required init () {

    }
}

let Y = X.self

// prints "asdf"
Y().me()

Some of the docs refer to this as `.Type`, but `MyClass.Type` gives me an error in the playground.

Problem

I am trying to dynamically create a `class` instance based type using generics, however I am encountering difficulty with class introspection. Here are the questions: - Is there a Swift-equivalent to Obj-C's `self.class`? - Is there a way to instantiate a class using the `AnyClass` result from `NSClassFromString`? - Is there a way to get `AnyClass` or otherwise type information strictly from a generic parameter `T`? (Similar to C#'s `typeof(T)` syntax)

Original source

Related problems