Swift 从C导入的扩展结构

Swift 从C导入的扩展结构,swift,swift4.2,Swift,Swift4.2,我是Swift的新手,我有以下扩展: extension UIView.KeyframeAnimationOptions { init(animationOptions: UIView.AnimationOptions) { rawValue = animationOptions.rawValue } } 自Swift 4.2以来,rawValue=animationOptions.rawValue产生以下警告: Initializer for struct '

我是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: {
...
}

如何从从C导入的结构中修复此警告消息?

您的代码从来都不正确。应该是:

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

但是,这是个坏主意。您正在将一个枚举的选项强制为一个不相关的枚举。这将导致问题。

其目的是限制跨模块结构初始值设定项。这加强了初始化结构的安全性

Swift结构设计灵活,实现灵活 可以在不同版本之间更改。因为初始化者必须 初始化每个存储的属性,它们有两个选项:

  • 在返回或使用self之前分配每个属性
  • 使用
    self.init(…)
    self=…
    一次分配所有属性
前者要求知道结构中存储的每个属性。如果 所有这些属性都是公共的,但是 另一个目标可以实现自己的初始值设定项 添加新的存储属性(公共或非公共)将导致源中断 改变

你可以在这里找到更多细节

Swift 4.1开始,您的代码应如下所示:

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

为什么要尝试从类型为
UIView.AnimationOptions
的值创建
UIView.KeyframeAnimationOptions
?那不合适。它们有不同的类型和不同的用途。谢谢你的解释。两个答案代码运行良好。