일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Xcode
- xcode로 날씨앱 만들기
- Timer
- RunningTimer
- UIAlertAction
- 영문 개인정보처리방침
- 러닝타이머
- MKMapItem
- Required Reason API
- Protocol
- 서체관리자
- dispatchsource
- 러닝기록앱
- font book
- WeatherManager
- App Store Connect
- AnyObject
- CoreLocation
- UICollectionViewFlowLayout
- Startign Assignments
- swift
- SwiftUI Boolean 값
- MKMapViewDelegate
- CLLocationManagerDelegate
- weatherKit
- weak var
- 한국어 개인정보처리방침
- 클로저의 캡슐화
- 단일 책임원칙
- addannotation
Archives
- Today
- Total
VesselWheel
뷰 계층에서 lazy 키워드 사용하기 본문
lazy 키워드를 사용하는 이유는?
lazy 키워드를 사용하는 주요 이유는 성능 최적화와 초기화 시점의 제어입니다.
- 성능 최적화: lazy 키워드를 사용하면 해당 프로퍼티의 초기화를 미룰 수 있습니다. 이는 메모리를 효율적으로 사용하는 데 도움이 됩니다. 예를 들어, 무거운 계산이나 복잡한 구성이 필요한 객체의 경우, 실제로 필요한 시점에 초기화를 하면서 메모리 사용을 최적화할 수 있습니다.
- 초기화 시점 제어: 클래스의 다른 프로퍼티들이 모두 초기화된 후에 특정 프로퍼티를 초기화하고 싶을 때 lazy 키워드를 사용합니다. 이를 통해 다른 프로퍼티들의 최초 값들을 참조해서 초기화를 할 수 있습니다.
그래서 이 코드에서 lazy 키워드를 사용하면 collectionView가 실제로 필요한 시점에 초기화를 하게 됩니다.
이를 통해 메모리를 효율적으로 사용하고, 필요에 따라 count 값에 따른 초기화를 할 수 있습니다.
//
// MiddleView.swift
// Instagram
//
// Created by Jason Yang on 1/30/24.
//
protocol MiddleViewDelegate: AnyObject {
func didTappedCollectionViewCell()
}
import UIKit
class MiddleView: UIView, UICollectionViewDelegate {
// weak var delegate: MiddleViewDelegate?
weak var middleViewdelegate: MiddleViewDelegate?
// MARK: - UI Properties
var dataSource: [CollectionModel] = []
var collectionViewImages: [CollectionModel] = [
CollectionModel(id: 0, name: "image0", imageName: "picture 0"),
CollectionModel(id: 1, name: "image1", imageName: "picture 1"),
CollectionModel(id: 2, name: "image2", imageName: "picture 2"),
CollectionModel(id: 3, name: "image3", imageName: "picture 3"),
CollectionModel(id: 4, name: "image4", imageName: "picture 4"),
CollectionModel(id: 5, name: "image5", imageName: "picture 5"),
CollectionModel(id: 6, name: "image6", imageName: "picture 6"),
CollectionModel(id: 7, name: "image7", imageName: "picture 7"),
CollectionModel(id: 8, name: "image0", imageName: "picture 0"),
CollectionModel(id: 9, name: "image1", imageName: "picture 1"),
CollectionModel(id: 10, name: "image2", imageName: "picture 2"),
CollectionModel(id: 11, name: "image3", imageName: "picture 3"),
CollectionModel(id: 12, name: "image4", imageName: "picture 4"),
CollectionModel(id: 13, name: "image5", imageName: "picture 5"),
CollectionModel(id: 14, name: "image6", imageName: "picture 6"),
CollectionModel(id: 15, name: "image7", imageName: "picture 7")
]
private lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal // 스크롤 방향을 수평으로 설정
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(MiddleCollectionViewCell.self, forCellWithReuseIdentifier: MiddleCollectionViewCell.identifier)
collectionView.backgroundColor = .white
collectionView.isScrollEnabled = true
return collectionView
}()
// MARK: - Life Cycle
override init(frame: CGRect) {
super.init(frame: frame)
dataSource = collectionViewImages
collectionView.reloadData()
setUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension MiddleView {
private func setUI() {
backgroundColor = .white
addSubview(collectionView)
heightAnchor.constraint(equalToConstant: 380).isActive = true
widthAnchor.constraint(equalToConstant: 425).isActive = true
NSLayoutConstraint.activate([
collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
collectionView.topAnchor.constraint(equalTo: self.topAnchor),
collectionView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
])
}
}
// MARK: - UICollectionViewDataSource
extension MiddleView: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSource.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MiddleCollectionViewCell.identifier, for: indexPath) as? MiddleCollectionViewCell else {
return UICollectionViewCell()
}
let collectionImage = dataSource[indexPath.row]
cell.configure(with: collectionImage)
return cell
}
}
// MARK: - UICollectionViewDelegateFlowLayout
extension MiddleView: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 124, height: 124)
}
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, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 1
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 1
}
}
'Xcode Study' 카테고리의 다른 글
How to add SwiftUI in UIkit project programmatically (0) | 2024.02.04 |
---|---|
MVVM 아키텍처 활용하기 (0) | 2024.02.03 |
같이 일하고 싶은 개발자 (0) | 2024.01.31 |
programmatically NavigationController 만들기(feat. NavigationItem, toolbar, UINavigationControllerDelegate) (1) | 2024.01.31 |
programmatically TabBarController 만들기 (1) | 2024.01.31 |