Swift 从C导入的扩展结构
我是Swift的新手,我有以下扩展: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 '
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=…
extension UIView.KeyframeAnimationOptions {
init(animationOptions: UIView.AnimationOptions) {
self = .init(rawValue: animationOptions.rawValue)
}
}
为什么要尝试从类型为
UIView.AnimationOptions
的值创建UIView.KeyframeAnimationOptions
?那不合适。它们有不同的类型和不同的用途。谢谢你的解释。两个答案代码运行良好。