두 라이브러리 모두 비동기환경에서 이미지를 받아오고 처리하는 라이브러리다. 여러 귀찮은 작업들(기본 이미지, 캐시, call 취소) 등이 구현되어 있어 편리하다는 장점이 존재한다. 무슨 차이일까? 1. 구현 언어 Kingfisher는 Swift로 짜여 있고 SDWebImage는 Objective-C로 짜여 있다는 차이점이 존재한다. (캐시를 처리해야 하므로 킹피셔에 Objective-C가 있긴 하다) 2. 동시성 처리 동시성 프로그래밍을 위해 Kingfisher는 GCD를 사용하지만 SDWebImage는 NSOperation을 사용한다. 나중에는 Swift Concurrency로 짜인 라이브러리가 나올지도? 3. 캐시 캐시를 처리할 때 Kingfisher는 기본적으로 메모리 캐시가 적용되어 있다. 원하는..
스위프트에서 메서드를 만들어 사용하다 보면 어느샌가부터 for, with와 같은 키워드를 사용했다. 이걸 매개변수 레이블(parameter labe)라고 한다. 함수를 보고 매개변수가 어떤 용도로 사용하는지 암시하여 이해를 돕기 위해 사용한다. 딱히 기능이 있는 것은 아니라 그냥 눈치껏 함수 이름에 맞춰서 붙여 사용하면 된다. for나 with 말고도 아래와 같은 레이블이 존재한다. by: 매개변수의 값이 증가/감소를 뜻하고 싶을 때 from: 특정 값을 기반으로 새로운 결과를 만들고 싶을 때. (url, data, String 등) to: 함수를 이용하여 특정 목적에 전달, 도달하기 위해 using: with와 유사 in: 어떠한 범위 안에서 작업을 할 때 조사하면서 알았던 것은 익숙하지 않으면 그냥 ..
self 보통 인스턴스 메서드 안에서 현재 객체를 가르키고 싶을 때 사용한다. 프로퍼티, 메서드를 대상으로 한다. Self 단순 객체가 아니라 Type(class, struct etc)을 가르키는 키워드이다. 만약 static 메서드를 사용한다면 이건 타입 자체에 속하기 때문에 self를 사용할 수 없다. 부끄럽게도 이제야 이걸 알게 되었다. 몰랐던 원인은 Xcode가 알려줄때 Self를 사용해야 하는 시점에 해당 타입을 추천해줘서 직접 모든 타입명을 다 입력해서 사용했기 때문이다. 반성
진짜 오랜만에 블로그에 글을 적는다. 사실 공부 활동은 깃헙으로 계속하고 있었지만 블로그에는 완성된 글을 적어어 한다고 생각하고 있었기 때문에 이런 지체가 생긴거 같다. 앞으로도 code & 디자인패턴 등은 계속 깃헙과 노션으로 정리를 할거 같지만 하루를 마감하는 용도로 블로그를 사용하고자 한다. 방치하던 MVVM도 마찬가지고 1. MVVM에 빠져서 헤어나오질 못하고 있다. MVVM의 명확한 예시라는게 존재하지 않는 거 같다. 예시를 다섯가지 들어 코드를 작성해봤는데 다 다루고 있는 모양이 달랐다. 내가 알기론 MVC 패턴에서의 다양한 문제를 Rx 프로그래밍을 적용하여 해결하기 위해 만들어진 디자인 패턴이 MVVM으로 알고 있는데 같은 문제를 프로토콜, 델리게이트, RxSwift 다양한 문제로 해결하고 ..
delegate는 대표, 위임자를 뜻하는 단어입니다. 델리게이트 패턴이란 하나의 객체가 모든 해야 할 일을 모두 정의하고 처리하는 것이 아니라 특정 행동에 대해서는 그것만을 전담하는 객체에게 일을 넘기는 것을 말합니다. 생산성 향상을 위해서 도입하는 패턴이라고 보시면 될 듯합니다. 상속만큼 강력한 재사용성을 보여주기도 하는 패턴으로 GUI 환경에서 많이 쓰입니다. 대표적으로 이벤트 리스너(Event Listener)에서 사용되고 있고 이미 우리는 이 패턴에 따라 생성된 함수들(onClick() 같은)을 호출해서 코드를 작성하고 있습니다. iOS 개발(UIKit)에서도 예외가 아닙니다. 그래서 어떻게 사용할까요? 1. 원하는 객체의 뒤에 Delegate를 붙여 프로토콜을 선언합니다. 때로는 이 단계에서 무..
1. SnapKit 사용방법을 알았다. 기존 AutoLayout을 구성할 때 불편하던 부분, 특히 코드 수가 불필요하게 늘어나는 문제를 해결하는 도구인 거 같다. 빌드 시간이 많이 늘어난다면 몰라도 이 정도면 안 쓸 이유가 없는 거 같다. cocoaPods 말고 SPM로 설치하였다. 2. 화면을 구성할 때 어떤것을 우선해서 구현을 해야 하는지 연습 중이다.
아이디어 푸는데 정말 오래 걸린 문제이다. 난이도 자체는 어렵지 않고 어떻게 풀어야 할지 생각도 빨리 났다. 하지만 내가 큐라는 개념을 직접 구현해서 풀려고 했고 그걸 다 암기해야 한다는 강박관념 때문에 미루고 있었다. 이 문제는 더블 스택으로 큐를 구현해서 풀면 더 빨리 구현이 가능하지만 스위프트 언어의 특성상 array를 큐처럼 사용할 수 있다. 너무 쓸데없는 포인트에 집착할 필요도 없는 거 같다. 해답 func solution(_ priorities:[Int], _ location:Int) -> Int { var priorities = priorities var location = location var result = 0 while !priorities.isEmpty { let currentMax..
아이디어 왼손과 오른손을 결정짓는 규칙을 생각하지 못해서 검색으로 힌트를 얻었다. 이중 배열로 그래프를 만든 후 한 칸씩만 움직일 수 있다는 점을 이용해서 풀 생각이었지만 레벨 1이라는 점과 인턴 문제라는 점에서 조금 더 쉽게 풀 수 있을 거라는 걸 예상하지 못했다. 테스트 케이스를 두어 개 더 작성했다면 혼자 풀 수도 있었을 거 같다. 해답 import Foundation func solution(_ numbers:[Int], _ hand:String) -> String { var locationLeft = 10 var locationRight = 12 var result: String = "" for number in numbers { var number = number if number == 1 |..
참고 프로젝트 개요 - MVVM 구조 - SwiftUI -ToDO 리스트 프로젝트 UserDefaults에 데이터 저장 // ViewModel.swift class ListViewModel: ObservableObject { @Published var items: [ItemModel] = [] { //ItemModel은 두개의 String과 하나의 Bool로 구성되어 있습니다. didSet { //items 값이 변화하면 감지하면 saveItem 메소드를 실행합니다. saveItem() } } let itemsKey: String = "items_list" func saveItem() { if let encodedData = try? JSONEncoder().encode(items) { UserDefau..
아이디어 스위프트의 문자열이 복잡하다고 알고 있다면 조금 어폐가 있다. 쉽게 쓸 수 있는 방법도 존재한다. 파이썬으로 한번 풀었던 거라 어떻게 풀지는 이미 알았던 문제였다. 무자가 총 26개라는 것에 주목하여 글자의 인덱스 번호와 n의 덧셈이 26을 넘을 때 동작하게 만든다. 해답 func solution(_ s:String, _ n:Int) -> String { let upper = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ") let lower = Array("abcdefghijklmnopqrstuvwxyz") var result = "" for ch in s { if upper.contains(ch) { var index = upper.firstIndex(of: ch)! + n i..