#swift #inheritance #protocols #inout
Вопрос:
Приведенный ниже код не компилируется. Я пытаюсь отправить класс функции, которая изменяет этот класс, где класс соответствует протоколу. Этот протокол наследуется от другого базового протокола. Я ожидал бы, что компилятор будет знать, что s (спортивный автомобиль) соответствует автомобилю, но это не так.
Этот код работает, если функция test_car не изменяет аргумент car.
Спасибо
protocol Car { var wheels: Int { get set } } protocol SportsCar : Car { var engine: Int { get set } } class Test { var p: Plunk var s: SportsCar init() { print("Making Test") p = Plunk() s = p } func run() { print("Running Test") test_car(car: s ) // error: argument type 'SportsCar' does not conform to expected type 'Car' print("Finished Test") } func test_car(car: inout Car) { print("Car has (car.wheels) wheels") car.wheels = 1 print("Wheel added") print("Car now has (car.wheels) wheelsn") } } class Plunk : SportsCar { var wheels: Int var engine: Int var plunk: Bool init(){ wheels = 4 engine = 1 plunk = true } }
Ответ №1:
Я пытаюсь отправить класс в функцию
Вы должны сказать это компилятору:
protocol Car: AnyObject { ... }
Итак, теперь компилятор знает, что конформер для the Car
будет экземпляром a class
. Так что вам больше не нужно inout
ключевое слово:
func test_car(car: Car) { ... }
Комментарии:
1. Большое спасибо. Это решило проблему.