快速提示:属性配置

如果您从事iOS开发已有一段时间,那么您会遇到大型的initviewDidLoad()方法,如下所示:

 类MyViewController:UIViewController { 
  var collectionView:UICollectionView? 
 覆盖func viewDidLoad(){ 
super.viewDidLoad()

让layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizo​​ntal

collectionView = UICollectionView(frame:.zero,
collectionViewLayout:布局)
collectionView?
.translatesAutoresizingMaskIntoConstraints = false
collectionView?.isPagingEnabled = true
collectionView?.backgroundColor = .clear
collectionView?.showsHorizo​​ntalScrollIndicator = false
view.addSubview(collectionView!)
//自动版式代码…
}
}

由于Swift能够配置闭包内联的属性,因此我们可以做得更好。

 类MyViewController:UIViewController { 
 让collectionView:UICollectionView = { 
让flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = .horizo​​ntal
让collectionView = UICollectionView(
帧:.zero,
collectionViewLayout:flowLayout

collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.isPagingEnabled = true
collectionView.backgroundColor = .clear
collectionView.showsHorizo​​ntalScrollIndicator = 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
showsHorizo​​ntalScrollIndicator = false
}
  } 
 类MyViewController:UIViewController { 
 让collectionView = UICollectionView(flowLayoutScrollDirection:.horizo​​ntal) 
  //标记:-生命周期 
 覆盖func viewDidLoad(){ 
super.viewDidLoad()
view.addSubview(collectionView)
//自动版式代码...
}
}

现在这很干净,但我们仍有改进的空间。 所有声明为常量的实例属性(即let )都在创建对象时初始化,因此我们的集合视图在视图控制器初始化期间初始化。 如果有大量的let属性配置起来很昂贵(例如许多自定义UI或数据源对象),这可能会导致内存占用量大幅增加。 幸运的是,我们有一个简单的解决方案:延迟加载。

延迟加载是一种仅在首次访问时才加载事物的策略。 在我们的示例中,仅在尝试将集合视图添加到视图层次结构时才需要加载它。 实施起来非常简单。

 类MyViewController:UIViewController { 
 惰性var collectionView = UICollectionView(flowLayoutScrollDirection:.horizo​​ntal) 
  //标记:-生命周期 
 覆盖func viewDidLoad(){ 
super.viewDidLoad()
view.addSubview(collectionView)
//自动布局代码...
}
}

这样好多了! 您可能会注意到我们的集合视图不再是常数。 在撰写本文时,尚无法创建延迟加载的常量实例属性。 但是,此简单的变通办法应有助于限制此属性的设置方法的范围:

 私人(设置)惰性变量collectionView = UICollectionView(…) 

现在,我们的集合view属性只能在视图控制器的核心实现范围内设置(即, class MyViewController: UIViewController { … } )。 如果您使用扩展来组织代码,则视图控制器中可以访问设置器的部分将受到很大限制。 这不是一个完美的解决方案,但可行。 静态声明或在全局范围内声明的常量将自动延迟加载。

以这种方式配置属性将有助于保持代码的灵活性和易读性,同时优化性能。

在下一篇文章中,我们将探讨如何在Swift中合并惰性序列。