我正在编写一个在多个元素上使用相同动画的应用程序。为了让我的生活更轻松,我想创建一个通用函数,它将从我的故事板中获取一个对象并为其设置动画。
我正在寻找什么
// Object I want to pass
IBOutlet weak var titleLabel: UILabel!
// Animate function
func animateIn<T>(a: AnyObject, myType:T.Type) {
if let a = a as? T{
UIView.animate(withDuration: 0.3, delay: 0.0, options: [], animations: {
a.transform = .identity
})
UIView.animate(withDuration: 0.5, delay: 0.1, options: [], animations: {
a.alpha = 1.0
})
}
}
// Call function
animateIn(a: titleLabel, myType: UILabel.self)
然而,我得到了错误:
T
类型的值没有成员transform
类型T
的值没有成员alpha
我该如何解决这个问题?
答案 0 :(得分:0)
如果确实希望将其设计为通用函数 - 稍后会详细介绍 - 那么您必须约束通用参数T
作为{{ 1}}子类。例如:
UIView
用法:
func animateIn<T: UIView>(view: T) {
UIView.animate(...) {
view.transform = ...
}
}
并且,这样做,你真的不需要你的额外元类型参数(即animateIn(view: titleLabel)
)。您只需要正确约束的通用myType: T.Type
;)
非通用替代。如果您的T
函数不接受任何其他相关的视图参数(并且也不会返回任何视图),那么最好完全跳过泛型来完成这样一个简单的函数:
animate