Структура расширения, импортированная из C - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в Swift, и у меня есть это расширение:

extension UIView.KeyframeAnimationOptions {
    init(animationOptions: UIView.AnimationOptions) {
        rawValue = animationOptions.rawValue
    }
}

Начиная с swift 4.2, rawValue = animationOptions.rawValue выдаёт мне это предупреждение:

Initializer for struct 'UIView.KeyframeAnimationOptions' must use "self.init(...)" or "self = ..." because the struct was imported from C

Я использую расширение какчто:

UIView.animateKeyframes(withDuration: 1.2, delay: 0.0, options: [.repeat, UIView.KeyframeAnimationOptions(animationOptions: .curveEaseOut)], animations: {
...
}

Как я могу исправить это предупреждение от struct was imported from C?

Благодаря вашему ответу

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Целью этого является ограничение кросс-модульных инициализаторов структуры.И это обеспечивает безопасность инициализации структуры.

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

  • Назначить каждое свойство перед возвратом или использованием self.
  • Назначить все свойства одновременноиспользуя self.init(…) или self = ….

Первый требует знания каждого хранимого свойства в структуре.Однако если все эти свойства являются общедоступными, клиент в другом целевом объекте может реализовать свой собственный инициализатор, и внезапное добавление нового сохраненного свойства (общедоступного или нет) становится нарушением исходного кода.

Вы можете найти более подробную информацию здесь здесь .

Ваш код, начиная с Swift 4.1 , должен выглядеть следующим образом:

extension UIView.KeyframeAnimationOptions {
    init(animationOptions: UIView.AnimationOptions) {
        self = .init(rawValue: animationOptions.rawValue)
    }
}
0 голосов
/ 26 сентября 2018

Ваш код никогда не был правильным.Это должно быть:

extension UIView.KeyframeAnimationOptions {
    init(animationOptions: UIView.AnimationOptions) {
        self.init(rawValue: animationOptions.rawValue)
    }
}

Но это плохая идея.Вы вводите параметры одного перечисления в несвязанное перечисление.Это вызовет проблемы.

...