IBInspectable, IBDesignable 스토리보드로 작업을 하다보면 인스펙터에서 속성값을 조정하는 일이 많은데 하나 가장 귀찮았던 것은 border 값을 설정하는 게 기본적으로 없다는 것이다. border 값을 매번 코드로 몇 줄씩 짜는 것보다 인스펙터 창에서 설정할 수 있으면 얼마나 좋을까? IBInspectable과 IBDesignable 어트리뷰트를 이용하면 그것을 가능하게 할 수 있다. 인터페이스 빌더에서 실시간으로 객체에 속성을 적용하고 확인 가능 런타임이 아니라 컴파일 타임에 확인 가능 바로 반영이 안 될 수 있음 // 인터페이스 빌더 인스펙터 영역 Show @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRa..
All
상수 관리, API Key 관리 enum 인스턴스 생성 불가 case rawValue → 중복 불가 static let → 여러 곳에서 접근, 한 번 메모리에 올라가면 종료될 때까지 남아있음 struct 인스턴스 생성 가능 인스턴스 생성을 막으려면 init()을 private하게 제어해주면 됨 URL Endpoint 분리하기 예전에는 단순하게 타입 프로퍼티를 이용해서 상수 관리하는 것처럼 URL을 관리했었는데 다음과 같이 enum을 이용해서도 URL을 관리할 수 있을 것 같다. Endpoint로 파일명을 짓는 것은 좋은 것 같다. Moya를 사용하거나, Alamofire 또는 URLSession을 모듈화해서 사용할 때도 Endpoint라는 이름으로 파일을 만들고 URL을 관리했던 것 같다. enum En..
클로저 함수의 형태와 함수의 호출 구조를 잘 이해한다면 쉽게 받아들일 수 있을 것 같다. // 다음도 잘 구분할 수 있으면 클로저의 이해를 도울 수 있다. func example() {} example // 함수 자체 example() // 함수 호출 클로저 기본 구조 클로저 헤더와 클로저 바디 부분을 잘 이해하자. { (매개 변수) -> 리턴 타입 in// 클로저 헤더 실행 구문// 클로저 바디 } 인라인 클로저 (inline closure) // 코드를 생략하지 않고 클로저 구문 씀, 함수의 매개변수 내에 클로저가 그대로 들어간 형태 // => 인라인 클로저 getStudyWithMe(study: { () -> () in print("주말에도 공부하기") }) 트레일링 클로저 (trailing clo..
서버 통신 시 셀에 보여줄 UIImage 변환 시점 urlString ▶️ url ▶️ image url로 바꾸고 또는 image로 바꾸는 과정을 어디에서 진행하는 것이 좋을까? 서버 통신 시점에서 할지 => 시간이 오래걸리고, 사용자가 보지 않을 수 있는 정보에 대해서도 작업을 진행할 수 있어서 비효율적 셀에서 처리할지 => 조금 더 적절해보인다. 마찬가지로 서버 통신을 셀에서 할 경우 셀이 꺼내질 때마다 요청이 들어가 call 수가 증가할 수 있다. Alamofire의 데이터 받아오는 메서드(Response Handler) // Response Handler - Unserialized Response func response(queue: DispatchQueue = .main, completionHa..
본 글은 WWDC 를 보고, 번역 및 요약 그리고 실행해보는 스터디 프로젝트의 일환입니다. Introducing Combine WWDC19에는 Apple의 최신 Framework인 Combine을 소개합니다. 비동기 프로그래밍에 대해서 이야기하자고 하면서 서막을 여는데요. 같이 예시를 보고 이해하면서 Combine에 대해서 알아보도록 합시다. 간단한 회원가입 화면을 예시로 듭니다. 이 화면에서의 요구사항은 크게 다음과 같습니다. 우선 사용자 이름이 유효한지 네트워크에 요청을 해서 확인을 합니다. 그리고 비밀번호가 서로 일치하는지 확인을 합니다. 이 모든 작업은 메인 스레드에서 차단되지 않고 반응형 인터페이스를 유지해야 합니다. 먼저 사용자 이름을 입력하기 시작합니다. 여기서도 이미 많은 비동기 작업이 진..
인증키와 gitignore 항상 gitignore는 먼저 처리하자. 이후에 인증키를 처리하려고 하면 commit에도 남아있고, 이전 기록에 남아있으므로 번거롭다. 프로젝트 내에서 empty 파일 생성 후 프로젝트 바로 밑에 .gitignore 생성 가능 협업 시에는 property list, configuration을 이용하는 식으로도 인증키를 관리한다. 숨겨야 하는 파일이 많으면 public repository가 적합한지부터 판단하자. gitignore.io에 가면 쉽게 파일에 들어갈 내용을 만들 수 있다. 숨김파일로 잘 등록하면 프로젝트 내의 파일 옆에 A(추가)/M(수정) 마크가 뜨지 않는다. Type Inference와 Type Annotation 속도 차이 Type Annotation을 이용하기..
App Transport Security Apple 측에서는 앱 자체의 보안성을 위해서 ATS(App Transport Security)라는 정책을 통해 기본적으로 https 통신을 하도록 유도하고 있다. 그래서 http 서버와 통신을 하려고 하면 에러가 발생한다. http 서버로 테스트하려면 Info.plist에서 ATS 관련 설정을 해주어야 한다. ATS는 iOS 9 버전 이후부터 적용된 개인정보보호 기능이고, Xcode 7 버전 이상에서 앱 생성 시 기본값으로 가져가게 되는 보안 정책이다. http : Allow Arbitrary Loads를 YES로 변경 https : 굳이 설정을 해줄 필요가 없음 데이터 리로드 시점 테이블 뷰나 컬렉션 뷰 사용 시 viewDidLoad 시점에 가지고 있는 데이터..
프로토콜과 String(describing: _)사용해서 리터럴한 값 덜어내기 그 동안 identifier 값을 쓰는 곳이 정말 많았다. ViewController와 TableViewCell, CollectionViewCell 등에서 많이 사용했었다. 매 클래스에서 하드코딩된 문자열 값을 넣는 대신 프로토콜을 이용하면 불편함과 반복을 줄일 수 있다. protocol Reusable: Anyobject { static var reuseidentifier: String { get } } 다음과 같이 extension에서 프로토콜을 채택하게 되면, 이제 reuseidentifier를 편하게 접근해서 사용할 수 있다. extension UIViewController: ReusableViewProtocol { /..