Question: I am extending a base class (one which I do not control) in Swift. I want to provide a class function for creating an instance typed to a subclass. A generic function is required. However, an implementation like the one below does not return the expected subclass type. 

```
class Calculator {
    func showKind() { println("regular") }
}

class ScientificCalculator: Calculator {
    let model: String = "HP-15C"
    override func showKind() { println("scientific") }
}

extension Calculator {
    class func create<T:Calculator>() -> T {
        let instance = T()
        return instance
    }
}

let sci: ScientificCalculator = ScientificCalculator.create()
sci.showKind()

```

The debugger reports `T` as `ScientificCalculator`, but `sci` is `Calculator` and calling `sci.showKind()` returns "regular". 

Is there a way to achieve the desired result using generics, or is it a bug?

Answer: 
Ok, from the [developer forums](https://devforums.apple.com/message/1064957#1064957), if you have control of the base class, you might be able to implement the following work around.

```
class Calculator {
    func showKind() { println("regular") }
    required init() {}
}

class ScientificCalculator: Calculator {
    let model: String = "HP-15C"
    override func showKind() { println("\(model) - Scientific") }
    required init() {
        super.init()
    }
}

extension Calculator {
    class func create<T:Calculator>() -> T {
        let klass: T.Type = T.self
        return klass()
    }
}

let sci:ScientificCalculator = ScientificCalculator.create()
sci.showKind()

```

Unfortunately if you do not have control of the base class, this approach is not possible.
This doesn't explain why your generic approach isn't working. I'm just looking for an alternative.

It seems with Swift that they have replaced factory methods with convenience initializers. You can create a new convenience initializer and add that with an extension to `Calculator`.

```
extension Calculator {
    convenience init(name: String) {
        println(name)
        self.init()
    }
}

let reg = Calculator(name: "Reg")
reg.showKind()  // "regular"

let sci = ScientificCalculator(name: "Sci")
sci.showKind()  // "scientific"

```