快速提示:属性配置
如果您从事iOS开发已有一段时间,那么您会遇到大型的init
和viewDidLoad()
方法,如下所示:
类MyViewController:UIViewController {
var collectionView:UICollectionView?
覆盖func viewDidLoad(){
super.viewDidLoad()
让layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
collectionView = UICollectionView(frame:.zero,
collectionViewLayout:布局)
collectionView?
.translatesAutoresizingMaskIntoConstraints = false
collectionView?.isPagingEnabled = true
collectionView?.backgroundColor = .clear
collectionView?.showsHorizontalScrollIndicator = false
view.addSubview(collectionView!)
//自动版式代码…
}
}
由于Swift能够配置闭包内联的属性,因此我们可以做得更好。
类MyViewController:UIViewController {
让collectionView:UICollectionView = {
让flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = .horizontal
让collectionView = UICollectionView(
帧:.zero,
collectionViewLayout:flowLayout
)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.isPagingEnabled = true
collectionView.backgroundColor = .clear
collectionView.showsHorizontalScrollIndicator = false
返回collectionView
}()
//标记:-生命周期
覆盖func viewDidLoad(){
super.viewDidLoad()
view.addSubview(collectionView)
//自动布局代码...
}
}
现在, viewDidLoad()
仅包含与加载视图直接相关的代码,所有属性配置都已集中,其范围大大缩小。 我们也保证存在集合视图属性。
我们可以做得更好。 也许我们想在应用程序的其他地方重用相同的集合视图配置。 我们可以使用便捷的初始化程序扩展UICollectionView
,并完全从视图控制器中重构出我们的配置代码。
扩展UICollectionView {
便利初始化(
flowLayoutScrollDirection:UICollectionViewScrollDirection){
让flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = flowLayoutScrollDirection
self.init(frame:.zero,collectionViewLayout:flowLayout)
translationsAutoresizingMaskIntoConstraints = false
isPagingEnabled = true
backgroundColor = .clear
showsHorizontalScrollIndicator = false
}
}
类MyViewController:UIViewController {
让collectionView = UICollectionView(flowLayoutScrollDirection:.horizontal)
//标记:-生命周期
覆盖func viewDidLoad(){
super.viewDidLoad()
view.addSubview(collectionView)
//自动版式代码...
}
}
现在这很干净,但我们仍有改进的空间。 所有声明为常量的实例属性(即let
)都在创建对象时初始化,因此我们的集合视图在视图控制器初始化期间初始化。 如果有大量的let
属性配置起来很昂贵(例如许多自定义UI或数据源对象),这可能会导致内存占用量大幅增加。 幸运的是,我们有一个简单的解决方案:延迟加载。
延迟加载是一种仅在首次访问时才加载事物的策略。 在我们的示例中,仅在尝试将集合视图添加到视图层次结构时才需要加载它。 实施起来非常简单。
类MyViewController:UIViewController {
惰性var collectionView = UICollectionView(flowLayoutScrollDirection:.horizontal)
//标记:-生命周期
覆盖func viewDidLoad(){
super.viewDidLoad()
view.addSubview(collectionView)
//自动布局代码...
}
}
这样好多了! 您可能会注意到我们的集合视图不再是常数。 在撰写本文时,尚无法创建延迟加载的常量实例属性。 但是,此简单的变通办法应有助于限制此属性的设置方法的范围:
私人(设置)惰性变量collectionView = UICollectionView(…)
现在,我们的集合view属性只能在视图控制器的核心实现范围内设置(即, class MyViewController: UIViewController { … }
)。 如果您使用扩展来组织代码,则视图控制器中可以访问设置器的部分将受到很大限制。 这不是一个完美的解决方案,但可行。 静态声明或在全局范围内声明的常量将自动延迟加载。
以这种方式配置属性将有助于保持代码的灵活性和易读性,同时优化性能。
在下一篇文章中,我们将探讨如何在Swift中合并惰性序列。