Equatable Equatable은 두개의 값이 동일한 값인지 아닌지 비교를 하기 위해서 따라야하는 프로토콜입니다. 이 프로토콜을 따르는 타입의 인스턴스는 == 나 != 연산자로 같은지, 같지 않은지 판단할 수 있게 됩니다. Swift 표준 라이브러리의 대부분의 기본 타입들(Int, Double, Float, String, Bool, ...)은 이 프로토콜을 따르고 있습니다. 기본 타입들이 아닌 클래스, 구조체도 해당 프로토콜을 따르면 비교연산자를 통해서 같은지, 아닌지 판단할 수 있게 됩니다. Equatable 프로토콜을 살펴보면 static func ==(lhs: Self, rhs: Self)->Bool 함수를 구현함으로써 해당 프로토콜을 쓸 수 있게 되어 있습니다. lhs는 ==의 왼쪽에, rhs..
서브스크립트는 콜렉션 타입(Array, Dictionary, Set), 시퀸스 등 집합의 인스턴스에서 특정 항목에 쉽게 접근할 수 있게 해주는 문법입니다. 우리가 평소에 자연스럽게 사용하던 배열 인스턴스의 특정 항목에 접근하기 위해 사용하는 someArray[index], Dictionary에서의 someDictionary[key] 과 같은 문법이 서브스크립트입니다. 서브스크립트를 통해 추가적인 메서드 필요없이 특정 값을 할당하거나 가져올 수 있습니다. 그리고 하나의 타입에 여러 서브스크립트를 정의하고, overload도 가능. 매개변수도 하나가 아니라 여러개를 받도록 정의할 수 있습니다. 서브스크립트의 작성 서브스크립트를 선언하는 방법은 계산프로퍼티를 선언하는 것과 유사합니다. subscript(ind..
Swift의 열거형(enumeration, enum)에 대해서 작성해봅니다. 열거형은 유사성을 가진 값들을 공통된 타입으로 선언해서, 형 안정성(type-safety)을 보장하는 코드를 작성할 수 있게 해줍니다. rawValue와 관련값을 가질 수 있고, 일급객체이기 때문에 계산프로퍼티, 함수를 작성할 수 있고 초기화를 지정하거나 확장도 가능합니다. 열거형의 기본 문법 열거형의 기본 문법은 아래와 같습니다. 열거형은 타입 정의와 같기 때문에 네이밍을 파스칼표기법으로 해주고, case문에는 카멜표기법으로 해줍니다. enum SomeEnum { case someCase case anotherCase case otherCase } 사용 예. enum Almond { case honeyButter case wa..
얼마전 애플에서 3년간 업데이트 되지 않은 어플을 앱스토어에서 퇴출시키겠다는 통보를 했다는 뉴스가 있었는데요. 해당 통보 이후 많은 개발자들이 항의를 한 모양입니다. 그래서 정책을 수정해서 3년간 업데이트를 하지 않은 어플 중, 12개월 간 최소 다운로드 임계점을 넘지 않은 앱들에 한해서 앱스토어에서 퇴출시킨다는 이메일 안내를 하고 통보 후 30일 내에 업데이트를 하라고 한 것을 90일로 변경한다고 합니다. Clarifying criteria & new timing extension for App Store Improvements process - Latest News - Apple Developer User trust in quality apps is the basis for all we have do..
Swift 5.0부터 도입된 Result타입에 대해 정리해봅니다. Result타입은 실패가 가능한 작업을 할 때 기존에 성공시 원하는 데이터를, error발생시 Error를 throw하는 문법 대신에 Result타입을 던지도록 되어 있는 문법입니다. 이걸 도입한 이유는 기존에 error를 처리하던 throw방식에 몇가지 문제가 있었기 때문입니다. 기존 throw, do, try, catch 문법 Result타입을 보기 전에 먼저 기존의 throw문법을 보겠습니다. 아몬드를 주문하는 예제입니다. enum AlmondOrderError: Error, CaseIterable { case invalidSelection // 잘못된 선택 case lackOfMoney // 예산 부족 case outOfStock ..
제네릭 Generic은 단어의 뜻이 '포괄적인, 통칭의'라는 의미입니다. 단어의 의미처럼 제네릭은 타입에 종속적이지 않도록 Swift 코드를 좀 더 유연하고, 재사용 가능한 함수 및 코드를 작성할 수 있도록 도와주는 요소입니다. Swift 표준 라이브러리에서 기본 제공하는 swap 함수를 예시로 들 수 있습니다. Swift의 기본 swap함수가 없다고 가정하고, 두 Int값을 inout 매개변수로 받아서 해당 원본값을 서로 바꿔주는 함수를 작성한다고 한다면, // a, b 두 개의 Int값을 바꾸려는 함수 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } var intOne = 3 var ..
클로저(Closure)는 코드 블럭 { } 으로 Objective-C의 block이나 타 언어의 람다, 익명함수와 유사한 개념입니다. Swift에서는 함수가 '이름이 있는 클로저'라고 하는 편이 맞습니다. 이전 글에서 Swift에서는 함수가 1급객체라는 포스팅을 했는데, 바로 클로저의 존재가 이를 가능하게 해줍니다. 클로저의 형태 클로저는 아래의 세가지 형태가 있습니다. 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저 클로저 표현 Swift에서 클로저 표현은 간결하고 명확한 표현을 지원해줍니다. 기..
먼저 작성한 글에서 클로저는 특정문맥의 상수, 변수 값을 참조로 캡쳐링한다고 정리했습니다. 클로저와 값 캡쳐 클로저는 특정 문맥의 상수나 변수의 값을 캡쳐할 수 있습니다. 이는 원본 값이 사라져도 클로져의 body안에서 그 값을 활용할 수 있다는 이야기입니다. Swift에서 값을 캡쳐 하는 가장 단순한 형 swifty-cody.tistory.com 캡쳐 리스트 캡쳐링을 하는 값의 참조 규칙을 캡쳐리스트를 통해서 정해줄 수 있습니다. 클로저의 캡쳐리스트 내에 정의하면 캡쳐링할 때 본래의 타입에 맞게 캡쳐링되도록 사용되게 할 수 있습니다. 즉, 값 타입은 클로저가 생성될 시점의 값이 copy되어지고, 참조 타입은 클로저가 호출되는 시점에 참조되어 사용되도록 사용되어지게 합니다. 캡쳐리스트는 클로저 in 앞에..
클로저는 특정 문맥의 상수나 변수의 값을 캡쳐할 수 있습니다. 이는 원본 값이 사라져도 클로져의 body안에서 그 값을 활용할 수 있다는 이야기입니다. Swift에서 값을 캡쳐 하는 가장 단순한 형태는 중첩 함수(nested function). 중첩 함수는 함수의 body에서 다른 함수를 다시 호출하는 형태로 된 함수입니다. // 반환 값이 () -> Int 클로저인 함수 형태 func makeIncrementer(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementer() -> Int { runningTotal += amount return runningTotal } return incrementer } 위 함수에서 i..
Swift에서는 함수가 1급객체이기 때문에 함수를 매개변수로 넣을수가 있습니다. 1급 객체(First class citizen)와 고차함수(고계함수) 프로그래밍 언어에서 1급 객체란 아래의 조건을 충족시키면 됩니다. 1. 변수나 데이터에 할당 할 수 있어야 한다. 2. 객체의 파라메터로 넘길 수 있어야 한다. 3. 객체의 리턴값으로 리턴 할수 있 swifty-cody.tistory.com 이 때 함수가 끝나고 실행되거나 함수 밖에 저장되는 클로저일 때, (RxSwift에서 onNext, onComplete, onError이벤트 클로저 같은) 보통 비동기 작업 후 실행되는 (completeHander로 많이 쓰이는)클로저는 매개변수 타입 앞에 @escaping 키워드를 명시해주어야 합니다. 명시해주지 않았..
프로그래밍 언어에서 1급 객체란 아래의 조건을 충족시키면 됩니다. 1. 변수나 데이터에 할당 할 수 있어야 한다. 2. 객체의 매개변수로 넘길 수 있어야 한다. 3. 객체의 반환값으로 리턴 할수 있어야 한다. Swift 기본타입들(Int, Bool, Struct, ...)은 물론 1급 객체이고, 함수 또한 1급 객체로 취급이 됩니다. 1. 변수나 데이터에 할당 // Int형 파라메터 2개를 받아서 Int를 반환하는 함수형을 선언 var mathFunction: (Int, Int) -> Int // Int값 두 개를 입력받고 Int를 반환하는 함수 func addTwoInts(_ a: Int, _ b: Int) -> Int { return a + b } // addTwoInts함수를 mathFunction..
Set은 Array와 유사하지만 같은 값을 또 넣을 수 없다는 특징이 있는 Collection Type입니다. '집합'을 표현하고 이에 대한 처리를 할 때 유용합니다. Set 형태로 저장되기 위해서는 반드시 타입이 hashable이어야 합니다. Swift에서 String, Int, Double, Bool 같은 기본 타입은 기본적으로 hashable입니다. Swift에서 Set 타입은 Set으로 선언. 빈 Set 생성 var letters = Set() letters.insert("a") letters = [] 배열 리터럴로 Set 생성 var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"] // 타입 추론으로 생략 가능 var favoriteGenres:..