2016-10-30 5 views
0

Я пытаюсь вызвать инициализатор, требуемый протоколом A, для типа, который соответствует A и является подклассом C.Общие ограничения и наследование инициализатора в Swift

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

Вот что я имею в виду:

protocol A { 
    init(foo: String) 
} 

class B { 
    init() {} 
} 

class C: B {} 

func makeSomething<T: A>() -> T where T: B { 
    return T(foo: "Hi") 
} 

Это работает. Но если я изменю where T: B до where T: C, я получаю следующую ошибку: argument passed to call that takes no arguments. Позвольте мне позвонить только B с init.

Почему я не могу назвать этот инициализатор? Я понимаю, что у суперкласса есть свои назначенные инициализаторы, которые нужно вызвать. Но это будет соблюдаться, когда кто-то действительно пишет класс, который подклассы B и соответствует A. (Например, с использованием init(Foo: String) и вызова super.init(bar: Int) внутри).

Любая помощь здесь будет принята с благодарностью. Благодаря!

ответ

0

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

Итак, когда вы тягот свой тип возвращаемого значения, как

func makeSomething<T: A>() -> T where T: C 

Это требует инициализации для класса C, как Swift не может обеспечить по умолчанию initializer.But, если ваш удалить, где положение все работает отлично

func makeSomething<T: A>() -> T { 
    return T(foo:"string") 
} 

Если вы хотите вернуть return T(foo: "Hi"):

Вы получаете ошибку, AUSE класс C не имеет инициализатора, который принимает init(foo: String)

Изменение класса C, как

class C: A { 
    required init(foo: String) { 

    } 
} 

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

Итак, помните, если вы не подклассы. Существует уже один инициализатор, выполняющий вашу работу, и вы не получите ошибку.

Смежные вопросы