Вам нужно пометить инициализатор required
, потому что вы используете его из общего расширения, которое применяется ко всем типам, унаследованным от Foo
(включая сам Foo
). Однако, если вы не пометили инициализатор как required
, ваши подклассы Foo
могут не наследовать этот инициализатор, если они определили хотя бы один назначенный инициализатор, как описано в Автоматическое наследование инициализатора .
Таким образом, если вы не отметили init(key: String, value: Any?)
инициализатор Foo
required
, ваше универсальное расширение Array не может гарантировать, что метод инициализатора, вызываемый в расширении, существует для всех типов, к которым применяется расширение.
Если вы хотите применить расширение только к классу Foo
и не хотите применять его к его подклассам, вы можете использовать extension Array where Element == Foo {...
, и в этом случае вам не нужно будет отмечать инициализатор как необходимый , поскольку тип Foo
гарантированно имеет этот инициализатор.