July 23, 2021

Три умных расширения Swift для повышения эффективности

Swift поставляется с великолепной концепцией, называемой расширением, позволяющей нам расширять любой существующий класс, протокол или объект и добавлять новую функцию или функциональность без доступа к исходному коду. Наиболее распространенный пример этой возможности - расширение визуального визуального компонента UIKit.

Сегодня я хочу поделиться с вами тремя идеями, которые я использую в каждом приложении для iOS, чтобы получить более чистый код.

  1. 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! Классно, правда?