быстрая программа для интерфейса

Класс Car и Truck написаны здесь в качестве примера, но они могут быть неизвестны программе во время компиляции.

могло быть больше видов автомобилей, еще не известных

например, может существовать специальный класс под названием Ferrari, Lamborghini, который может пойти по дороге, неизвестной системе.

наша цель - программировать интерфейс, а не конкретную реализацию

нам нужно сделать похожее на следующее

создать экземплярvar vehicle: IDrive = Vehicle()vehicle.drive()

мы попробовали некоторые методы и не смогли заставить его работать без приведения к конкретным реализациям, нам нужно независимое решение без необходимости приведения к конкретной реализации.

Любой боковой подход также приветствуется, возможно, наш подход совершенно неверен, но с учетом ограничений, которые функционируютinstantiateAndDrive должен иметьprotocol основанный параметр

Примечание для отрицательных избирателей ака манекены: вместо этого задавайте вопросы, чтобы уточнить, если это не имеет смысла для вас, или возьмите «Книгу шаблонов дизайна для идиотов».

    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)

Edit - попытка использования класса после ответа скорости AirSpeed

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)

Ответы на вопрос(2)

Ваш ответ на вопрос