모듈을 만들어서 사용하다가 다음과 같은 에러 메시지를 만났다. overriding non-open instance method outside of its defining module import UIKit open class BaseView: UIView { public override init(frame: CGRect) { super.init(frame: frame) configureAttributes() configureLayout() } @available(*, unavailable) public required init?(coder: NSCoder) { super.init(coder: coder) } public func configureAttributes() {} public func confi..
All
들어가며 Notification은 값, 데이터 전달할 때 정말 유용한 녀석이다. 어떻게 보면 사용 방법도 되게 단순한데 써야 할 코드가 곳곳에 퍼져있고, 많이 쓰다보면 관리가 어려워진다. 적절할 때 쓰면 참 좋은 친구... (특히 계층이 복잡할 때 쓰면 꿀이다 🍯) 오늘 그래서 단순하게 장점 설명하려고 글을 쓰게 된 것은 아니고, 불편했던 점을 개선해 본 것을 기록하고자 한다. (아 그리고 글 쓰다 보면 말투가 정말 오락가락 한데 이해해주시길 ... 글 좀 더 써보고 한 가지로 정착해야겠다.) 불편했던 점 불편했던 점은 Notification.Name 안에 들어가는 문자열을 post 하는 쪽과 addObserving 하는 쪽을 정확히 맞춰주어야 한다는 점이다. 휴먼에러가 발생할 가능성이 높고, 코드가 곳..
BaseViewController 사실 이전에도 BaseViewController를 만들어서 서브클래싱하는 작업을 해왔었는데 어느 순간 프로토콜을 쓰는 게 좋다는 주변 말이 많이 들렸다. 그래서 그런가라는 생각을 나도 덩달아 했었는데, 상속을 하는 구조가 무작정 나쁘다는 생각을 하는 것이 오히려 잘못되지 않았나라는 생각이 들었다. 어차피 상속은 하나의 클래스만 할 수 있고, 모든 컨트롤러에서 공통적으로 쓰여야 하는 내용이라면 하나의 BaseViewController로 상속받아 사용하는 것이 더 낫지 않나 생각이 든다. 개인적으로 그 외적인 것들을 프로토콜로 관리하는 것이 더 맞는 것 같다. 상속과 합성을 적절히 사용하는 것이 가장 적절한 것 같은데 그 정도를 찾기가 정말 어려운 것 같다. BaseView..
타입 확인 type(of: x) type(of: value) 형 변환 - 타입 변환 초기화 구문 사용 이니셜라이저 구문을 통해서 새롭게 인스턴스를 생성하는 것 let value = String(a) 타입 확인 연산자 is 어떤 클래스의 인스턴스 타입인지, 어떤 데이터 타입인지 확인할 때 사용 class Mobile { let name: String var introduce: String { return "\(name) 입니다." } init(name: String) { self.name = name } } class Apple: Mobile { let wwdc = "WWDC22" } class Google: Mobile {} mobile is Mobile mobile is Apple mobile is G..
PageViewController 이슈 PageViewController를 처음 사용하다보면 다음과 같은 이슈를 만날 수 있다. 해석을 조금만 해보면 쉽게 문제를 알 수 있다. Issue Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The number of view controllers provided (3) doesn't match the number required (1) for the requested transition' View Controller가 필요 이상으로 할당되었다는 것이다. 1개만 필요한데 3개나 넣었다는 것이다. 😅 기존 코드 // PageViewController.swift impo..
들어가며 UIImage는 Decodable과 Encodable을 따르지 않습니다. 한 마디로 UIImage는 Codable 프로토콜을 따르지 않기 때문에 에러가 발생하게 됩니다. 데이터 모델 구조를 짤 때 주의해야 할 것 같습니다. struct SampleDataModel: Codable { let image: UIImage // ⛔️ 에러 발생하는 부분 let title: String let contents: String let tag: [Int] let createdAt: String } 해결 지금은 image 단일 객체에 에러가 발생하고 있기 때문에, 아래 2가지 방법 중 적절하게 하나를 택해서 코드를 작성하면 될 것 같습니다. 예시 1 struct SampleDataModel: Codable { ..
first(where:) Array의 인스턴스 메서드이다. 생각보다 정말 많은 곳에서 코드가 사용되어서 이번에 정리해야겠다는 생각이 들었다. 정의 func first(where predicate: (Element) throws -> Bool rethrows -> Element? Parameter predicate 시퀀스의 요소를 인수로 사용하고 요소가 일치하는지 여부를 나타내는 부울 값을 반환하는 클로저. Return Predicate를 만족하는 첫 번째 요소를 반환하거나, 없다면 nil을 반환한다. Example 1 (Apple 공식 문서) let numbers = [3, 7, 4, -2, 9, -6, 10, 1] if let firstNegative = numbers.first(where: { $0 ..
들어가기전에 Rx, Reactive Programming이 비동기 프로그래밍을 잘하기 위한 노력이라고 이전 시간(Reactive Programming 편)에 이야기했는데 그럼 비동기? 비동기 프로그래밍이 무엇일가요? 간단하게 살펴보도록 하죠. 비동기 프로그래밍? iOS 앱은 다음과 같은 작업을 수행할 수 있습니다. 버튼 탭(클릭)에 반응하기 키보드를 텍스트 필드로 애니메이션하면 포커스가 사라짐 인터넷에서 큰 사진 다운로드 → 다운로드 중에 다른 작업을 수행 데이터 비트를 디스크에 저장 오디오 재생 출처 : Raywenderich - 여기 클릭 한 번 생각을 해보면 각각의 작업들은 서로의 실행을 차단하지 않습니다. 서로 다른 스레드에서 서로 다른 작업을 수행할 수 있도록 iOS는 다양한 종류의 API를 제..