목록iOS (21)
먐
RxSwift에서는 기본적으로 subscribe를 하면 항상 새로운 시퀀스가 시작된다.의도하지 않았다면 엄청난 리소스 낭비이다. 모든 구독자가 하나의 시퀀스를 공유하게 하고 싶을 때는 어떻게 해야 할까?여러 가지 방법이 존재한다.multicastpublishreplayrefCountshare 1. multicast public func multicast(_ subject: Subject) -> ConnectableObservable where Subject.Observer.Element == Element { ConnectableObservableAdapter(source: self.asObservable(), makeSubject: { subject }) }파라미터 ..

enum은 공부가 잘 되면서도 막상 쓰려고 보면 활용이 힘든 경우가 많다!이번 포스팅에서는 enum의 개념을 처음부터 다시 톺아보고 정리 열거형An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code.애플 공식 문서에 정의된 열거형에 대한 설명열거형은 관련된 값들을 하나의 그룹으로 만들어 타입으로 정의 선언enum Enumeration { case case1 case case2 case case3} ex)enum CompassPoint { case north case sout..

에러 정의Swift의 에러는 Error 프로토콜을 준수하는 타입의 값으로 나타냄.이 프로토콜로 우리는 에러를 처리하는 데 사용할 수 있다! 라고 알림커스텀 에러를 정의하고 싶다면 Error 프로토콜 채택 필요enum MyError: Error { case customError1 case customError2} 예시를 통해 throw, try, do-catch를 이해해 보자.사용할 예시는 은행 계좌와 관련된 에러 핸들링거래가 불가능한 계좌이거나, 잔액이 부족한 상황을 핸들링할 수 있는 에러를 정의하고 처리해 보자. 에러 던지기 - Throwing에러가 발생할 수 있는 함수, 메서드, 초기화 구문에서는 파라미터 뒤에 throws 키워드 작성에러 상황에서는 throw를 사용하여 에러를 던지기...
프로토콜은 메서드, 프로퍼티, 특정 작업이나 기능의 청사진을 의미한다. 청사진(靑寫眞) 또는 블루프린트는 아키텍처 또는 공학 설계를 문서화한 기술 도면을 인화로 복사하거나 복사한 도면을 말한다. 은유적으로 "청사진"이라는 용어는 어떠한 자세한 계획을 일컫는 데에 쓰인다. - 위키백과 프로토콜은 프로그래밍 내에서 흔히 약속, 규칙이라고 불린다. 프로토콜은 자신을 채택하는 타입들에게 지켜야 할 최소한의 요구사항을 전달할 수 있다. 단, 이에 대한 직접적인 구현은 하지 않는다. 프로토콜은 요구사항을 전달하고, 해당 프로토콜을 채택하는 타입은 해당 요구사항들을 구체화한다. Swift는 Protocol Oriented Programming, 프로토콜 지향 프로그래밍으로써 프로토콜은 매우 중요한 요소 중 하나! P..
초기화 해제 구문은 클래스 타입에서만 사용 가능 Swift는 클래스 인스턴스가 더이상 필요하지 않을 때 자동으로 할당 해제 Swift는 ARC를 사용하여 메모리를 관리하기 때문에, 일반적으로 우리가 직접 구현해서 수행할 필요는 없음. 하지만 deinit 시에 필요한 작업이 있을 수도 있으니 공부해 보기. 선언 deinit { } 클래스 당 하나의 초기화 해제 구문 파라미터 x 인스턴스가 할당 해제되기 직전에 자동으로 호출 따라서 직접 호출할 필요없음. 상위 클래스의 초기화 해제 구문은 하위 클래스 초기화 해제 구문으로 상속됨 하위 클래스 초기화 해제 구문이 끝날 때 자동으로 호출됨 상위 클래스 초기화 해제 구문은 하위 클래스에 초기화 해제 구문이 없더라도 항상 호출됨 초기화 해제 구문 동작 기본 예제 c..

초기화 타입의 저장된 프로퍼티에 초기값을 세팅 초기화 구문을 정의하여 초기화 구현 처음 사용되기 전에 타입의 새로운 인스터스가 올바르게 초기화되는 것을 보장하는 것이 주요 역할 저장 프로퍼티에 초기값 설정 클래스나 구조체 인스턴스가 생성될 때까지 모든 저장 프로퍼티에 반드시 초기값을 설정해야 함 저장 프로퍼티에 초기값을 설정하는 방법은 2가지 존재 프로퍼티를 정의할 때 기본값을 할당하기 초기화 구문을 사용하여 구문 내에서 프로퍼티에 초기값을 설정하기 초기화 구문 선언 init() { // 초기화 구문 } ex) class Student { var name: String init() { name = "Mini" print("Student class initialization") } } var student..
MVVM에 대해 깊게 파보기 전 내가 아는 MVC에 대해 돌아볼 필요성을 느꼈다. 거의 대부분 view를 그리는 코드와 viewController의 역할을 하는 코드를 모두 viewController에 작성하여 viewController 코드의 길이가 거대해지는 걸 보며 찝찝함을 버릴 수가 없었다 😥 (아무리 apple의 mvc에서 view와 viewController가 붙어 있다고 해도……) 따라서 view를 그리는 코드라도 분리하면 vc가 massive해지는 걸 막을 수 있지 않을까 해서 viewController와 view의 분리에 대해 찾아봤다. 실제로 loadView() 를 통해 viewController의 view를 내가 만든 view로 변경할 수 있었다. loadView() Creates t..
method dispatch를 공부해 보고 나니, 왠지 final 이 이 개념과 관련이 있을 것 같다는 생각이 들었다. 실제로 final swift... 를 치자마자 performance가 연관 검색어로 뜬다. final을 붙이는 이유에 대해서 이해하려면, method dispatch에 대해 먼저 알아야 한다. (이전 나의 method dispatch 글에서 가져왔다. 😄) [iOS/Swift] Method Dispatch class Parent { func method() { } } class Child: Parent { override func method() { } } let instance: Parent = Child() instance.method() Parent 를 상속하는 Child 클래스 ..

class Parent { func method() { } } class Child: Parent { override func method() { } } let instance: Parent = Child() instance.method() Parent 를 상속하는 Child 클래스 Parent 타입의 Child 인스턴스 생성 후 method 호출 시, 어떤 함수를 호출할까? 이때 어떤 함수를 호출할지 결정하는 매커니즘이 method dispatch이다. Dispatch의 2가지 타입 [먼저 알아야 할 것] 컴파일 타임 vs 런타임 정의 컴파일 타임: 개발자의 소스코드가 기계어로 컴파일되는 과정 런타임: 컴파일 과정을 마친 프로그램이 실행되는 과정 Static Dispatch 상속을 지원하지 않는 val..

in-out 파라미터 함수 파라미터는 기본적으로 상수이다. 함수 본문 내에서 파라미터 값을 변경하려고 하면 에러 발생 따라서 함수 파라미터 값을 변경하고, 함수 호출이 종료된 후에도 그 값을 유지하고 싶다면 inout 파라미터를 사용해 보자. 파라미터 타입 전에 inout 키워드를 작성해 준다. 수정 가능함을 알리기 위해 인수로 전달할 때는 & 붙여주기 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tmpA = a a = b b = tmpA } var a = 5 var b = 3 swapTwoInts(&a, &b) print(a, b) // 3 5 참고로 Swift에는 swap 함수가 이미 내장되어 있긴 하다…눙 in-out 파라미터의 전달 과정 함수가..