Унаследованные протоколы Swift, отправляемые функциям как inout

#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. Большое спасибо. Это решило проблему.