Я пытаюсь использовать протоколы и расширения в Swift, но получаю ошибку компиляции, которую не могу понять.
Если я объявлю два протокола, которые определяют Shape следующим образом:
protocol Shape {
var sides : Int { get }
var fill : Fill { get }
}
protocol Fill {
var color : UIColor { get }
}
Теперь, чтобы реализовать это, я определяю две структуры: одну для квадрата, а другую для сплошной заливки. Как это:
struct SolidFill : Fill {
var color : UIColor
}
struct Square : Shape {
var sides : Int = 4
var fill : SolidFill = SolidFill(color: UIColor.blackColor())
}
Я получаю сообщение об ошибке компиляции "Тип "Квадрат" не соответствует протоколу "Форма"". Если я заставлю тип заполнения быть заполненным как var fill : Fill
, ошибка компиляции исчезнет. Почему я не могу указать Square для заливки более конкретный тип, чем позволяет протокол?
Я понимаю, что для этого конкретного примера я мог бы изменить вещи, чтобы не использовать этот шаблон, используя Enum для заполнения или переделывая что-то еще. Я просто хочу знать, почему я не могу использовать тип fill, соответствующий протоколу.