처음 SOLID 원칙을 접했을때 단일책임 원칙을 보고들었던 생각이 그렇다면, 모듈 하나는 하나의 책임, 즉 하나의 모듈은 하나의 일만 해야된다는 뜻으로 이해 했었습니다. 그러나 단일 책임 원칙은 그게 아닙니다. 하나의 일만을 해야 하는것은 함수이며, 단일 책임 원칙의 의미는 "단일 모듈은 변경되는 이유가 하나여야 한다." ,"하나의 모듈은 하나의 액터에 대해서만 책임져야한다" 이런 뜻입니다. 여기서 말하는 액터란 해당 모듈을 특정한 목적을 의미하는듯 합니다. 또한 모듈이란 책에서는 하나의 소스코드 파일이라고 되어있지만, swift에서는 하나의 class 혹은 struct를 의미한다고 생각합니다. 단일 책임 원칙을 위배하는 경우 class Employee { func calculatePay() { //회계..
이번에는 기획자가 간단한 기능을 하나 추가해 달라고 합니다. 기존에는 이미지만 볼 수 있다면, 이번에는 영상도 볼 수 있게 해달라고 하네요. 일단은 영상을 재생시킬수 있는 뷰를 하나 만들어주겠습니다. final class VideoView: UIView { private var url: String? private var player = AVPlayer() private var playerLayer: AVPlayerLayer? private lazy var videoBackgroundView: UIView = { let view = UIView() view.backgroundColor = .systemGray view.translatesAutoresizingMaskIntoConstraints = fals..
프로토콜 지향 프로그래밍에 관해 공부를 하다가 우연히 해당 발표를 찾아서 여기에 나와있는 프로젝트를 진행해 보았습니다. https://www.youtube.com/watch?v=9gkzHUsQiUc&t=1138s 저희는 이제 사진첩 앱을 개발하려고 합니다. 사진첩은 테이블 뷰 모드와 콜렉션 뷰 모드를 지원하고, 각 셀을 클릭 하면 이미지를 크게 볼 수 있는 화면으로 이동합니다. 딱 보기에도 중복되 보이는 기능이 여럿 보입니다. 이미지와 설명, 테이블뷰와 콜렉션뷰는 같은 이미지를 저장하고 있는 배열을 공유하고, 셀을 클릭하였을때 동일한 페이지로 이동하는 기능이 중복되어 있습니다. 일단 UI부터 구성을 해보겠습니다. 테이블뷰와 콜렉션뷰는 이미지와 이미지 설명을 각각 가지고 있습니다. 이를 프로토콜로 선언해 ..
POP를 준수하면서 프로젝트를 진행하던 중 API에서 데이터를 받아오는 작업을 해야 할때, 평소 같으면 해당 작업을 담당하는 클래스를 하나 만들어서 작업을 하겠지만, POP를 이용한 프로젝트를 하던 참이였길래, 별 생각 없이 프로토콜을 우선적으로 구현하고 있었습니다. 그런데 해당 프로젝트에서는 코드를 재사용할 필요가 없을때에도 프로토콜로 추상화를 해야하나 이 생각이 들었습니다. final class NetworkManager{ static let shared = NetworkManager() func fetchImageList(url: String, completion : @escaping ([ContentResponse]?) -> ()){ guard let url = URL(string: url) el..
댓글이나 게시글의 목록을 보면 현재시간을 기준으로 몇분전, 몇일전, 혹은 날짜로 시간이 나와있는 경우가 있습니다. Swift에서는 Calender를 이용하여 계산할 수 있습니다. 서버에서 생성 시간을 받아오고 나서 우선 Calender로 계산할 수 있는 시간 형식을 만들어줍니다. private func calculateDate(to dateStr: String) -> Date { //서버에서 받은 시간이 2022-06-21T14:06:35.288Z 형식으로 되어있으므로 Calender로 계산할 수 있는 형식으로 만들기 var sliceDateStr = dateStr.components(separatedBy: ["T", "."]) sliceDateStr.removeLast() let joinedDateSt..
RxSwift의 목적 closure로 비동기 데이터 처리 코드를 작성할 시 코드가 복잡해짐. 비동기를 받고난 후 또 비동기를 받아야 할때 코드가 복잡해지고 길어짐. 따라서 return으로 비동기 데이터를 받을 수 있게 한것이 RxSwift이다 Observable 나중에 오는 데이터 타입이라고 생각을 하면 된다. 제네릭을 이용해 타입을 정의. Observable //나중에 오는 String타입 Observable로 데이터하나 보낼때 Observable.create(){ emitter in emitter.next("Hello") emitter.onCompleted() return Disposable.create() } Just 하나 보내는데 많은 코드가 필요하므로 단축해서 사용할 수 있다. Observabl..