
이제는 문법은 지겹도록 봤기에 앱만들기에 집중하고 있어 제네릭문법은 간단하게 다루으나 핵심은 담겨있다..(아님말구☺️) 필요하면 그때 더 심화된 내용으로 포스팅~! INDEX 1. 제네릭 2. 제네릭 타입 3. 연관 타입 4. 마무리 1. 제네릭 문법 1-1. 제네릭 문법은 왜(why) 필요한가? // 정수 2개 var num1 = 10 var num2 = 20 // 두 숫자를 스왑(서로 교환)하는 함수의 정의 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tempA = a a = b b = tempA } // 위에서 정의한 함수의 실행 swapTwoInts(&num1, &num2) print(num1) print(num2) // 만약, Double을 ..

INDEX 1. 에러 처리가 필요한 이유 2. 에러 처리 방법 3. 예제를 통한 에러 처리 연습 4. rethrows 키워드 5. 생성자와 메서드에서 throw 6. 마무리 1. 에러 처리가 필요한 이유 에러의 종류는 2가지 1) 컴파일 에러: 스위프트 문법과 관련된 에러(컴파일러가 미리 알고 수정해야한다고 고맙게 알려줌) 2) 런타임 에러: 프로그램이 실행되는 동안 발생 런타임 에러 -> 크래시(별도의 알림 없이 앱이 강제로 종료됨) : 발생가능한 에러를 미리 처리해 두면, 강제종료되지 않음 (개발자가 처리해야만 하는 에러) 런타임 에러 처리가 왜 필요할까? - 앱이 실행하는 중간에 꺼질까? - 어떤 얘기치 못한 상황이 발생할 수 있음(보험 느낌으로 필요) - 우리가 구현한 기능이 100% 정확히 동작..

지금까지 배운것들을 복습하는 느낌 INDEX 1. 객체내에서 클로저 사용 2. 강한 참조 사이클로 메모리 누수 사례 3. @autoclosure 4. 마무리 1. 객체내에서 클로저 사용 함수내부에 있는 클로저는 객체의 속성 및 메서드에 접근하기 위해서는 반드시 self키워드를 사용해야 했다. 이유는? why?? 실제로 클로저는 오래동안 객체를 사용해야 하고, 힙영역에 저장하고 사용할 객체의 주소를 저장한다. 따라서 클로저와 객체(클래스 인스턴스) 모두 힙영역에 존재하는 건 맞지만 둘다 힙영역에 재각각 따로 존재한다. (둘의 공간은 분리되어 있다. 아래코드를 예시로들면 sayMyName클로저들은 힙영역에 잇지만 모두 Person외부에 있음) 따라서 self키워드를 통해 객체를 강하게 참조를 하고 있다는 것..

이번 포스팅은 오늘 배울 것들을 언제 사용할까?에 초점을 맞추어서 보면 좋음 값(Value) 타입에서의 캡쳐리스트(Capture Lists)는 캡쳐(Capture)로는 불가능해 보이던 값 복사(value copy)를 가능하게 해주고, 참조(Reference)타입에서 캡쳐리스트(Capture Lists)는 weak, unowned과 함께 Strong Reference Cycle(강한 참조 사이클)을 해결하는데 사용 전에 포스팅했던 강한 참조, 약한 참조, 메모리 누수 개념이 기본으로 들어가기 때문에 ARC 부분에 대한 최소한의 이해도가 있어야 한다. INDEX 1. 클로저의 캡쳐(Capture) 현상 2. 캡쳐 리스트(Capture Lists) 3. @escaping 4. non- escaping 클로저와..

INDEX 1. ARC(Automatic Reference Counting) 2.강한 참조 싸이클(Strong Reference Cycle) 3. 약한 참조(weak References) 4. 미소유 참조(unowned References) 5. 마무리 1. ARC(Automatic Reference Counting) ARC는 자동 참조 카운팅으로, Swift에서 자동으로 메모리관리를 해주는 방식이다. RC(Reference Counting)은 참조타입인 클래스의 인스턴스(객체)에만 적용된다. ARC의 작동방식 객체(클래스의 인스턴스)가 생성될때마다 객체가 얼마나(몇 번이나) 참조(reference)되고 있는지를 계산(Counting)하는 방식 Swift의 경우, 컴파일러가 실제로 retain() 할당 ..

들어가기에 앞서... Swift는 객체지향 프로그래밍 언어이자, 프로토콜지향 프로그래밍언어이며, 함수형프로그래밍 언어다. 클래스와 구조체 단원을 정리하며 객체지향임을 알 수 있었고, 프로토콜 단원을 공부하며, 프로토콜 지향 언어인 것도 알 수 있었다. 이제는 클로저(Closure)를 공부하며 Swift가 함수형 프로그래밍 언어임에 대해 이해해볼 차례다. 물론 초반부에서 함수에 대한 설명을 했지만, 클로저를 알아야 함수형 프로그래밍 패러다임 스타일을 더 명확하게 이해할 수 있다. 개인적으로 Swift를 공부하면서 가장 낯설고, 어려웠던 부분이다. 기본 클로저 표기 문법들은 연습하면 금방 익숙해지지만, 메모리관리와 참조에 관한 부분이 섞여있어 한번에 이해하기엔 무리가 있는 개념이다. 하지만 너무나 중요한 부..

INDEX 1. 프로토콜의 확장(Extension) 2. 프로토콜 확장의 제한 3.선택적인 요구사항(Optional Protocols Requirements) 4. 프로토콜 지향 프로그래밍이란? 5. 마무리 1. 프로토콜의 확장(Extension) 프로토콜의 확장(Protocol Extension) 프로토콜의 확장에서는, 프로토콜의 선언에서 요구하는 필수요구 사항 메서드의 기본적인 디폴트 구현 제공 (귀찮은 방식으로) 프로토콜을 채택한 모든 타입에서, 동일 구현을 계속적으로 반복해야하는 불편함을 덜기 위해 "프로토콜 확장"을 제공해서 메서드의 디폴트 구현을 제공함 (코드의 중복을 피한다.) protocol Remote { func turnOn() func turnOff() } // 채택 ===> 실제구현..

INDEX 1. 프로토콜(Protocol)이란? 2. 프로토콜의 요구사항(Protocol Requirements) 3. 타입으로서의 프로토콜(Protocols as Types) 4. 기타 프로토콜 문법들 5. 마무리 1. 프로토콜(Protocol)이란? 프로토콜 (Protocols) 클래스의 상속의 단점을 보완하는 자격증의 개념 어떤 클래스, 구조체, 열거형에서나 채택가능하며 최소한의 요구사항만을 구현하면 해당 프로토콜의 기능을 사용가능 // 정의 protocol SomeProtocol { // 요구사항을 정의 (자격증의 필수 능력만 정의) func playPiano() //내부구현은 하지 않는다! } // 채택 및 구현 // 구조체에서 채택 struct MyStruct: SomeProtocol { //..