我是新手,我有这个扩展名:
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
发出的警告消息?
感谢您的回复
答案 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)
}
}
但这是一个坏主意。您正在将一个枚举的选项强制为不相关的枚举。这会引起问题。