본문 바로가기

swift20

Swift로 함수형 프로그래밍 시작하기 Swift로 함수형 프로그래밍 시작하기 링크: http://programmers.co.kr/learn/courses/4806 파트1. 함수형 프로그래밍 소개 현재의 프로그래밍 패러다임은 "동시성"이라는 관점으로 옮겨지고 있다. OOP에 가려서 주목을 받지 못하던 FP(함수형 프로그래밍)이 다시 주목을 받는 이유 프로그램 외부 효과를 주지 않는 방법으로 동시성 문제를 해결할 수 있기 때문 FP에 대한 오해들 프로그래밍 기법들 != FP Immutable Data Higher Order Function Currying Map Filter Reduce Side-Effect Free Programming == FP FP가 OOP를 대체할 수 있을까? OOP와 FP에 대해 잘 이해하고 현재 내가 당면한 문제를 해.. 2018. 12. 30.
사당 iOS 스터디 5주차 - 오류처리 CHAPTER 28 오류처리__28.1 오류처리란스위프트의 오류처리 기능을 통해 시스템(예를 들어 운영체제 등 우리가 작성하는 응용프로그램 외부)에서 발생한 오류를 처리할 수 있는 것이 아님을 명심__28.2 오류의 표현스위프트에서 오류(Error)는 Error라는 프로토콜을 준수하는 타입의 값을 통해 표현오류의 종류를 미리 예상한 다음, 오류 때문에 다음에 행할 동작이 정상적으로 진행되지 않을 때라면 오류를 던져(Throw Error)주면 됩니다.스위프트에서 오류를 처리하기 위한 네 가지 방법함수에서 발생한 오류를 해당 함수를 호출한 코드에 알리는 방법 do-catch 구문을 이용하여 오류를 처리하는 방법 옵셔널 값으로 오류를 처리하는 방법 오류가 발생하지 않을 것이라고 확신하는 방법 __28.3 오류.. 2018. 8. 17.
사당 iOS 스터디 5주차 - ARC CHAPTER 27 ARC__27.1 ARC란ARC는 더 이상 필요하지 않은 클래스의 인스턴스를 메모리에서 해제하는 방식으로 동작가비지 컬렉션 기법과의 차이가장 큰 차이는 참조를 계산(count)하는 시점 ARC 참조 카운팅 시점 컴파일 시 장점 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있어서 인스턴스가 언제 메모리에서 해제될지 예측할 수 있습니다. 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있어서 메모리 관리를 위한 시스템 자원을 추가할 필요가 없습니다. 단점 ARC의 작동 규칙을 모르고 사용하면 인스턴스가 메모리에서 영원히 해제되지 않을 가능성이 있습니다. 가비지 컬렉션 참조 카운팅 시점 프로그램 동작 중 장점 상호 참조 상황 등의 복잡한 상황에서도 인스턴스를 해제할 수 있는 가능성이 더.. 2018. 8. 17.
사당 iOS 스터디 5주차 - 프로토콜 지향 프로그래밍 CHAPTER 23 프로토콜 지향 프로그래밍__23.1 프로토콜 초기구현프로토콜과 익스텐션을 결합하면 코드의 재사용성이 월등히 증가프로토콜의 요구사항을 익스텐션을 통해 구현하는 것을 프로토콜 초기구현(Protocol Default Implementations)익스텐션을 통해 구현된 메서드 재정의특정 프로토콜을 준수하는 타입에 프로토콜의 요구사항을 찾아보고 이미 구현되어 있다면 그 기능을 호출하고, 그렇지 않다면 프로토콜 초기구현의 기능을 호출 제네릭, 프로토콜, 익스텐션을 통한 재사용 가능한 코드 작성스위프트의 클래스는 다중상속을 지원하지 않으므로 부모클래스의 기능으로 부족하다면 자식클래스에서 다시 구현해야 하지만, 프로토콜 초기구현을 한 프로토콜을 채택했다면 상속도 추가 구현도 필요 없습니다. 상속을 .. 2018. 8. 17.
사당 iOS 스터디 5주차 - 제네릭 CHAPTER 22 제네릭제네릭을 사용하고자 하는 타입 이름 제네릭을 사용하고자 하는 함수 이름 (함수의 매개변수...) 타입마다 다른 함수를 쓰지 않으려면 Any타입을 사용하면 되지 않을까?Any타입의 두 변수에 어떤 타입의 값이 들어있을지 모릅니다. Int면 Int끼리, String이면 String끼리 교환하고 싶은데, 그런 제한을 줄 수 없는 것다른 타입인 String 타입의 변수(stringOne, stringTwo)를 전달인자로 전달할 수가 없습니다.__22.1 제네릭 함수제네릭 함수는 실제 타입 이름(Int, String 등)을 써주는 대신에 플레이스홀더를 사용타입 매개변수플레이스홀더 타입의 이름을 지정하고 명시하는 역할을 하며, 함수의 이름 뒤 홀화살괄호 기호() 안쪽에 위치 함수의 매개변수.. 2018. 8. 17.
사당 iOS 스터디 5주차 - 익스텐션 CHAPTER 21 익스텐션__21.1 익스텐션이란익스텐션은 스위프트의 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가기능을 추가하려는 타입을 구현한 소스 코드를 알지 못하거나 볼 수 없다 해도, 타입만 안다면 그 타입의 기능을 확장할 수도 있습니다.스위프트의 익스텐션은 이름이 없습니다.스위프트의 익스텐션이 타입에 추가할 수 있는 기능연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 타입 메서드 / 인스턴스 메서드 이니셜라이저 서브스크립트 중첩 타입 특정 프로토콜을 준수할 수 있도록 기능 추가 익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없습니다.상속과 익스텐션 비교상속 확장 수직 확장 사용 클래스 타입에서만 사용 재정의 재.. 2018. 8. 17.
사당 iOS 스터디 4주차 - 프로토콜 CHAPTER 20 프로토콜__20.1 프로토콜이란프로토콜은 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의어떤 프로토콜의 요구사항을 모두 따르는 타입은 ’해당 프로토콜을 준수한다’고 표현프로토콜은 정의를 하고 제시를 할 뿐이지 스스로 기능을 구현하지는 않습니다.__20.2 프로토콜 정의__20.3 프로토콜 요구사항프로토콜은 타입이 특정 기능을 실행하기 위해 필요한 기능을 요구합니다. 프로토콜이 자신을 채택한 타입에 요구하는 사항은 프로퍼티나 메서드와 같은 기능들20.3.1 프로퍼티 요구프로토콜을 채택한 타입은 프로토콜이 요구하는 프로퍼티의 이름과 타입만 맞도록 구현해주면 됩니다. 프로퍼티를 읽기 전용으로 할지 혹은 읽고 쓰기가 모두 가능하게 할지는 프로토콜이 정해야 합니다... 2018. 8. 17.
사당 iOS 스터디 4주차 - 타입캐스팅 CHAPTER 19 타입캐스팅스위프트는 데이터 타입 안전을 위하여 각기 다른 타입끼리의 값 교환을 엄격히 제한암시적 데이터 타입 변환(Implicit Type Conversion)은 지원하지 않습니다.__19.1 기존 언어의 타입 변환과 스위프트의 타입 변환__19.2 스위프트 타입캐스팅스위프트에서는 다른 언어의 타입 변환 혹은 타입캐스팅을 이니셜라이저로 단순화스위프트 타입캐스팅은 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인양 행세할 수 있는 방법으로 사용할 수 있습니다.값의 타입을 확인하거나 다른 타입으로 전환타입캐스팅을 통해 프로토콜을 준수하는지도 확인스위프트와 타입캐스팅은 실제로 참조 타입에서 주로 사용Coffee는 Latte나 Americano인 척할 수 없지만, Latte나 Ame.. 2018. 8. 17.
사당 iOS 스터디 4주차 - 상속 CHAPTER 18 상속상속은 스위프트의 다른 타입과 클래스를 구별 짓는 클래스만의 특징다른 클래스로부터 상속을 받지 않은 클래스를 기반클래스(Base class)__18.1 클래스 상속__18.2 재정의자식클래스는 부모클래스로부터 물려받은 특성(인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 등)을 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용부모클래스의 특성을 자식클래스에서 사용하고 싶다면 super 프로퍼티를 사용super 키워드를 타입 메서드 내에서 사용한다면, 부모클래스의 인스턴스 메서드와 인스턴스 프로퍼티, 서브스크립트에 접근18.2.1 메서드 재정의스위프트는 메서드의 반환 타입이나 매개변수가 다르면 서로 다른 메서드로 취급 18.2.2 프로퍼티 재정의프.. 2018. 8. 17.
사당 iOS 스터디 3주차 - 모나드 CHAPTER 16 모나드모나드는 특정한 상태로 값을 포장하는 것에서 출발함수객체와 모나드는 특정 기능이 아닌 디자인 패턴 혹은 자료구조라고 할 수 있습니다.__16.1 컨텍스트‘콘텐츠’를 담은 그 무엇인가’를 뜻합니다.옵셔널은 some과 none이라는 두 가지의 컨텍스트를 갖습니다.__16.2 함수객체옵셔널은 컨테이너(컨텍스트가 일종의 컨테이너 역할을 합니다)와 값을 갖기 때문에 맵 함수를 사용할 수 있습니다.‘함수객체란 맵을 적용할 수 있는 컨테이너 타입’Array, Dictionary, Set 등등 스위프트의 많은 컬렉션 타입이 함수객체옵셔널 map 메서드 구현Optional(2).map(addThree) Optional.none.map(addThree) __16.3 모나드모나드는 함수객체의 일종으.. 2018. 8. 17.
사당 iOS 스터디 3주차 - 맵, 필터, 리듀스 CHAPTER 15 맵, 필터, 리듀스__15.1 맵맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수스위프트에서 맵은 배열, 딕셔너리, 세트, 옵셔널 등에서 사용스위프트의 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용맵을 사용하면 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 다시 컨테이너에 포장하여 반환기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환맵은 기존 데이터를 변형하는 데 많이 사용__15.2 필터필터는 말 그대로 컨테이너 내부의 값을 걸러서 추출하는 역할을 하는 고차함수filter 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool__15.3 리듀스리듀스는 컨테이너.. 2018. 8. 17.
사당 iOS 스터디 3주차 - 옵셔널 체이닝과 빠른종료 CHAPTER 14 옵셔널 체이닝과 빠른종료__14.1 옵셔널 체이닝옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정옵셔널에 값이 있다면 프로퍼티, 메서드, 서브스크립트 등을 호출할 수 있고, 옵셔널이 nil이라면 nil을 반환중첩된 옵셔널 중 하나라도 값이 존재하지 않는다면 결과적으로 nil을 반환결과적으로 nil이 반환될 가능성이 있으므로 옵셔널 체이닝의 반환된 값은 항상 옵셔널느낌표(!)값을 강제 추출하기 때문에 옵셔널에 값이 없다면 런타임 오류가 발생 옵셔널에서 값을 강제 추출해 반환하기 때문에 반환 값이 옵셔널이 아니라는 점 옵셔널 체이닝의 결괏값은 옵셔널 값이기 때문에 옵셔널 바인딩과 결합할 수 있는 것옵셔널 체이닝을.. 2018. 8. 17.
사당 iOS 스터디 3주차 - 클로저 CHAPTER 13 클로저클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있습니다.클로저의 몇 가지 모양 중 하나가 함수클로저의 세 가지 형태이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태클로저의 다양한 표현클로저는 매개변수와 반환 값의 타입을 문맥을 통해 유추할 수 있기 때문에 매개변수와 반환 값의 타입을 생략할 수 있습니다.클로저에 단 한 줄의 표현만 들어있다면 암시적으로 이를 반환 값으로 취급합니다.축약된 전달인자 이름을 사용할 수 있습니다.후행 클로저 문법을 사용할 수 있습니다.클로저 표현 방법은 클로저가 함수의 모습이 아.. 2018. 8. 17.
사당 iOS 스터디 2주차 - 접근제어 CHAPTER 12 접근제어__12.1 접근제어란접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공12.1.1 접근제어의 필요성12.1.2 모듈과 소스파일모듈 모듈은 배포할 코드의 묶음 단위 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단뒤 import 키워드를 사용 소스파일 소스파일 하나에 여러 타입(여러 개의 클래스나 구조체, 열거형 등)이나 함수 등 많은 것을 정의하거나 구현할 수도 있습니다. __12.2 접근수준각 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정타입 내부의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각에도 접근수준을 지정…12.2.1 공개 접근수준, public자신이 구현된 소스파일은 물론, 그 소스파일이 속해 있는 모듈,.. 2018. 8. 17.
사당 iOS 스터디 2주차 - 인스턴스 생성 및 소멸 CHAPTER 11 인스턴스 생성 및 소멸__11.1 인스턴스 생성스위프트의 이니셜라이저는 반환 값이 없습니다.클래스의 지정 이니셜라이저는 익스텐션에서 구현해줄 수 없습니다.11.1.1 프로퍼티 기본값구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 합니다. 초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재할 수 없습니다. 초기화와 프로퍼티 감시자 이니셜라이저를 통해 초깃값을 할당하거나, 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는 프로퍼티 감시자 메서드가 호출되지 않습니다. 11.1.2 이니셜라이저 매개변수11.1.3 옵셔널 프로퍼티 타입인스턴스가 사용되는 동안에 값을 꼭 갖지 않아도 되는 저장 프로퍼티가 있다면.. 2018. 8. 17.
사당 iOS 스터디 2주차 - 프로퍼티와 메소드 __10.1 프로퍼티10.1.1 저장 프로퍼티클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티 클래스의 저장 프로퍼티는 옵셔널이 아니라면 프로퍼티 기본값을 지정해주거나 사용자정의 이니셜라이저를 통해 반드시 초기화 클래스 인스턴스의 상수 프로퍼티는 인스턴스가 초기화(이니셜라이즈)될 때 한 번만 값을 할당 프로퍼티 기본값을 지정해주지 않는다면 이니셜라이저를 따로 정의해주어야 합니다. 저장 프로퍼티의 초깃값 지정 구조체는 프로퍼티에 맞는 이니셜라이저를 자동으로 제공 클래스의 저장 프로퍼티에 초깃값을 지정해주면 따로 사용자정의 이니셜라이저를 구현해줄 필요가 없습니다. 옵셔널 저장 프로퍼티 인스턴스를 생성할 때 이니셜라이저를 통해 초깃값을 보내야 하는 이유는 프로퍼티가 옵셔널이 아.. 2018. 7. 24.
사당 iOS 스터디 2주차 - 구조체와 클래스 구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입스위프트의 데이터 타입과 열거형은 모두 값 타입소스파일 하나에 여러 개의 구조체와 여러 개의 클래스를 정의하고 구현해도 문제가 없습니다.구조체 안에 구조체, 클래스 안에 클래스 등과 같이 중첩 타입의 정의 및 선언이 가능__9.1 구조체9.1.1 구조체 정의구조체를 정의한다는 것은 새로운 타입을 생성해주는 것과 마찬가지 대문자 카멜케이스를 사용하여 이름을 지어줍니다. 9.1.2 구조체 인스턴스의 생성 및 초기화구조체에 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정 인스턴스가 생성되고 초기화된 후 프로퍼티 값에 접근하고 싶다면 마침표(.).. 2018. 7. 23.
사당 iOS 스터디 1주차 - 옵셔널 스위프트의 특징 중 하나인 안전성(safe)을 문법으로 담보하는 기능‘변수나 상수 등에 꼭 값이 있다는 것을 보장할 수 없다. 즉, 변수 또는 상수의 값이 nil일 수도 있다’는 것을 의미__8.1 옵셔널 사용변수 또는 상수에 정말 값이 없을 때만 nil로 표현오류가 발생하는 nil 할당값이 없는 옵셔널 변수 또는 상수에 (강제로) 접근하려면 런타임 오류가 발생합니다. 그렇게 되면 OS가 프로그램을 강제 종료시킬 확룰이 매우 높습니다. 옵셔널 변수의 선언 및 nil 할당옵셔널 변수 또는 상수 등은 데이터 타입 뒤에 물음표(?)를 붙여 표현 __8.2 옵셔널 추출8.2.1 강제 추출런타임 오류의 가능성을 항상 내포하기 때문에 옵셔널 강제 추출(Forced Unwrapping) 방식은 사용하는 것을 지양 8.. 2018. 7. 23.
사당 iOS 스터디 1주차 - 함수 __7.1 함수와 메서드구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드모듈 전체에서 전역적으로 사용할 수 있는 함수를 그냥 함수__7.2 함수의 정의와 호출스위프트의 함수는 재정의(오버라이드)와 중복 정의(오버로드)를 모두 지원7.2.1 기본적인 함수의 정의와 호출매개변수 함수를 정의할 때 외부로부터 받아들이는 전달 값의 이름 예 hello(name: “Jenny”) 전달인자 전달인자(Argument), 혹은 인자는 함수를 실제로 호출할 때 전달하는 값 예 hello(name: “Jenny”) 7.2.2 매개변수함수를 호출할 때, 매개변수 이름을 붙여주고 콜론(:)을 적어준 후 전달인자를 보내준다 매개변수 이름과 전달인자 레이블 매개변수 이름(Parameter Name) 호출 시.. 2018. 7. 23.
Firebase DB에서 데이터를 가져올때 setValuesForKeys 메소드 오류 해결 Firebase DB에서 데이터를 가져올때 setValuesForKeys 메소드에서 오류가 발생했습니다.반나절이상 헤메다가 발견한 해결법은 의외로 정말 간단했습니다. 다음은 Firebase DB의 변경사항을 관찰하고 있다가 데이터를 실시간으로 받아오는 observe메소드를 이용한 코드입니다.가져온 데이터를 딕셔너리로 받아서 만들어 놓은 클래스에 객체로 집어 넣는 기능을 하는 메소드가 바로 setValuesForKeys이고 바로 여기서 에러가 발생했습니다. func observeDB() { Database.database().reference().child("users").observe(DataEventType.value, with: {(DataSnapshot) in self.array.removeAll(.. 2018. 4. 9.