Три умных расширения Swift для повышения эффективности
Swift поставляется с великолепной концепцией, называемой расширением, позволяющей нам расширять любой существующий класс, протокол или объект и добавлять новую функцию или функциональность без доступа к исходному коду. Наиболее распространенный пример этой возможности - расширение визуального визуального компонента UIKit.
Сегодня я хочу поделиться с вами тремя идеями, которые я использую в каждом приложении для iOS, чтобы получить более чистый код.
- Reduce Massive Controller Problem
Обычные UIKIT, такие как UICollectionView, UITableView, слишком сильно зависят от шаблона делегата для передачи данных, которые будут участвовать в создании проблемы в архитектуре MVC, сокращенно от Massive View Controller.
Таким образом, мы можем переместить подтверждение для DataSource, Delegate of UICollectionView в отдельное расширение, чтобы очистить наш основной ViewController. Просто прокрутите страницу вниз (или создайте новый файл), введите extension [имя вашего View Controller]: ComponentToExtend. В нашем случае мы хотим расширить делегатов или наш CollectionView и переместить все функции, относящиеся к делегатам, в ваше расширение.
extension ViewController : UICollectionViewDataSource , UICollectionViewDelegate , UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 5
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! PrivateOrderCell
cell.item = data[indexPath.row]
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let size = collectionView.frame
return CGSize(width: size.width, height: 100)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
}
2. Overloading the Constructor
Иногда нам нужно инициализировать экземпляр с одним или двумя значениями его свойств. Для этого мы можем создать расширение, содержащее наш инициализатор.
struct Student {
var name : String?
var surname : String?
var age : Int?
var address:String?
var phone :String?
var mobile : String?
var email : String?
}
extension Student {
init(name : String , surname : String) {
self.init(name: name, surname: surname, age: nil, address: nil, phone: nil, mobile: nil, email: nil)
}
}
3.Atomic Resource
В процессе разработки приложения вы будете многократно использовать одну и ту же группу цветов и шрифтов. И вам может потребоваться изменить их в конце проекта. Если вы жестко запрограммировали все цвета и шрифты в своем проекте, это очень затруднило бы изменение во всем проекте. Чтобы избежать этого, мы можем создать вычисляемое свойство, выходящее за пределы UIColor.
extension UIColor {
static var mainColor : UIColor {
return UIColor(hexString: "B2924E")
}
static var appGray : UIColor {
return UIColor(hexString: "424244")
}
}
Поэтому вместо использования собственных цветов Apple, таких как UIColor.systemBlue, теперь мы можем использовать нашу собственную цветовую палитру, написав UIColor.mainColor! Классно, правда?