将IBOutlet / object传递给可重复动画的通用函数

时间:2017-11-24 00:20:09

标签: ios swift generics uiview

我正在编写一个在多个元素上使用相同动画的应用程序。为了让我的生活更轻松,我想创建一个通用函数,它将从我的故事板中获取一个对象并为其设置动画。

我正在寻找什么

// 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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果确实希望将其设计为通用函数 - 稍后会详细介绍 - 那么您必须约束通用参数T作为{{ 1}}子类。例如:

UIView

用法:

func animateIn<T: UIView>(view: T) {
    UIView.animate(...) {
        view.transform = ...
    }
}

并且,这样做,你真的不需要你的额外元类型参数(即animateIn(view: titleLabel) )。您只需要正确约束的通用myType: T.Type;)

非通用替代。如果您的T函数不接受任何其他相关的视图参数(并且也不会返回任何视图),那么最好完全跳过泛型来完成这样一个简单的函数:

animate