programa rápido para interface

A classe Car e Truck é escrita aqui como exemplo, mas pode ser desconhecida para o programa em tempo de compilação.

poderia haver mais tipos de carros ainda não conhecidos

por exemplo, poderia haver uma classe especial chamada Ferrari, Lamborghini, que pode surgir na estrada desconhecida pelo sistema.

nosso objetivo é programar para interagir, não para uma implementação específica

precisamos fazer semelhante ao seguinte

criar uma instânciavar vehicle: IDrive = Vehicle()vehicle.drive()

tentamos algumas técnicas e não conseguimos fazê-lo funcionar sem transmitir para implementações específicas, precisamos de uma solução independente sem precisar transmitir para uma implementação específica.

Qualquer abordagem lateral também é bem-vinda, talvez nossa abordagem esteja totalmente errada, mas lembre-se das restrições que funcionaminstantiateAndDrive tem que ter umprotocol parâmetro baseado

Nota para eleitores negativos, também conhecidos como manequins: em vez disso, faça perguntas para esclarecer se não faz sentido para você ou compre um "Livro de padrões de design para idiotas"

    public protocol IDrive {
        func drive()
    }

    public class Car: IDrive {
        public init() {}
        public func drive() {}
    }

    class Truck: IDrive {
        public init() {}
        public func drive() {}
    }

class Test { //our attempts
   func instantiateAndDrive(Vehicle:IDrive.Type) {
       var vehicle = Vehicle()
       vehicle.drive()

   }

    func instantiateAndDrive2<T:IDrive>(Vehicle: T) {
        var vehicle = Vehicle()
        vehicle.drive()
    }
}

var test = Test()
test.instantiateAndDrive(Car.self)

Editar - Tente usar a classe após a resposta do AirSpeed Velocity

public protocol Drivable {
    init()
    func drive()
}

public class Car: Drivable {
    public required init() {}
    public func drive() { println("vroom") }
}

public class Truck: Drivable {
    public required init() {}

    public func drive() { println("brrrrrrm") }
}

class Test {
    func instantiateAndDrive(Vehicle:Drivable.Type) {
        var vehicle = Vehicle()
        vehicle.drive()
    }

    func instantiateAndDrive2<T:Drivable>(Vehicle: T) {
        ver vehicle = Vehicle()
        vehicle.drive()
    }
}
//var test = Test()
//test.instantiateAndDrive(Car.self)
//test.instantiateAndDrive(Truck.self)

questionAnswers(2)

yourAnswerToTheQuestion