从C导入的扩展结构

时间:2018-09-25 23:35:15

标签: swift swift4.2

我是新手,我有这个扩展名:

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

自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 :(得分:2)

其目的是限制跨模块结构初始化程序。这样就增强了初始化结构的安全性。

  

Swift结构被设计为灵活的并且其实现   可以在版本之间进行更改。由于初始化程序必须   初始化每个存储属性,它们有两个选项:

     
      
  • 在返回或使用self之前分配每个属性。
  •   
  • 使用self.init(…)self = …一次分配所有属性。
  •   
     

前者需要了解struct中每个每个存储的属性。如果   所有这些属性恰好都是公开的,但是,   另一个目标可以实现自己的初始化程序,突然   添加新的存储属性(无论是否公共)都会破坏源代码   改变。

您可以在here处找到更多详细信息。

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

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

答案 1 :(得分:0)

您的代码永远不正确。应该是:

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

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