Swift의 열거형(enumeration, enum)에 대해서 작성해봅니다. 열거형은 유사성을 가진 값들을 공통된 타입으로 선언해서, 형 안정성(type-safety)을 보장하는 코드를 작성할 수 있게 해줍니다. rawValue와 관련값을 가질 수 있고, 일급객체이기 때문에 계산프로퍼티, 함수를 작성할 수 있고 초기화를 지정하거나 확장도 가능합니다. 열거형의 기본 문법 열거형의 기본 문법은 아래와 같습니다. 열거형은 타입 정의와 같기 때문에 네이밍을 파스칼표기법으로 해주고, case문에는 카멜표기법으로 해줍니다. enum SomeEnum { case someCase case anotherCase case otherCase } 사용 예. enum Almond { case honeyButter case wa..
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 키워드를 명시해주어야 합니다. 명시해주지 않았..
Swift의 Dictionary타입은 Foundation의 NSDictionary를 bridge한 타입. 빈 Dictionary 생성 var namesOfIntegers = [Int: String]() namesOfIntegers[16] = "sixteen" namesOfIntegers = [:] 리터럴로 Dictionary 생성 var airports: [String: String] = = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] Dictionary 접근, 변경 print("The airports dictionary contains \(airports.count) items.") // 빈 Dictionary 확인 if airports.isEmpty { print("..
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:..
배열의 생성 // 빈 배열 생성 var someInts = [Int]() // 3을 추가 someInts.append(3) // 배열을 비움. Type은 Int로 유지됨 someInts = [] 기본값으로 빈배열 생성 var threeDoubles = Array(repeating: 0.0, count: 3) // threeDoubles : Double 타입의 [0.0, 0.0, 0.0] 배열끼리 합 var anotherThreeDoubles = Array(repeating: 2.5, count: 3) // anotherThreeDoubles : [2.5, 2.5, 2.5] var sixDoubles = threeDoubles + anotherThreeDoubles // sixDoubles : [0.0, ..
Swift의 네이티브 문자열 타입은 유니코드 스칼라 값으로 만들어져 있습니다. 하나의 유니코드를 21비트의 숫자로 구성되어 있습니다. 유니코드는 아래와 같이 결합을 시켜 사용할 수 있습니다. 유니코드의 결합 문자끼리의 결합 let eAcute: Character = "\u{E9}" // é let combinedEAcute: Character = "\u{65}\u{301}" // e + ́ // eAcute : é, combinedEAcute : é 문자와 심볼 심볼과 심볼 // 지역심볼문자인 U(1F1FA)와 S(1F1F8)를 결합 let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" // regionalIndicatorForUS : 🇺🇸 마지막으..
여러줄의 문자열을 쓰기 위해서는 쌍따옴표3개(""")를 사용하면 됩니다. let quotation = """ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "..
범위 연산자에는 닫힌 범위연산자, 반 받힌 범위연산자, 단방향 범위연산자가 있습니다. 닫힌 범위 연산자 (a...b)의 형태로 범위의 시작과 끝이 있는 연산자입니다. for index in 1...5 { print("\(index) times 5 is \(index * 5)") } // 1 times 5 is 5 // 2 times 5 is 10 // 3 times 5 is 15 // 4 times 5 is 20 // 5 times 5 is 25 반 받힌 범위연산자 (a..
Swift를 사용하면서 ??연산자를 명칭에 대한 생각을 해본적없이 계속 자연스레 사용하고 있었는데요. 해당 연산자의 명칭을 확실히 하고자 포스팅을 합니다. 포스팅 제목에도 썼듯이 ?? 연산자는 'Nil 병합 연산자'라고 부릅니다. 명칭 정리를 한김에 형태는 아래와 같고 a ?? b a가 nil값일 때 b라는 값을 사용하게 됩니다. 해당 코드는 아래 코드의 축약형이라고 볼 수 있습니다. a != nil ? a! : b 용법은 아래와 같습니다. let defaultColorName = "red" var userDefinedColorName: String? // 이 값은 defaults 값 nil var colorNameToUse = userDefinedColorName ?? defaultColorName /..
Swift에서의 비교연산자의 기본적인 내용은 타 언어의 그것과 같습니다. 나머지는 생략하고 튜플의 비교에 대해서 정리해봅니다. Swift에서는 같은 타입의 값을 갖는 두 개의 튜플을 비교할 수 있습니다. 튜플의 비교는 왼쪽에서 오른쪽 방향으로 이뤄지고 한번에 한개의 값만 비교합니다. 이 비교를 다른 두 값을 비교하게 될 때까지 수행합니다. 예시: (1, "zebra") < (2, "apple") // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문 (3, "apple") < (3, "bird") // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문 (4, "dog") == (4, "dog") // true 왼쪽 4는 오른쪽 4와 같고 왼쪽 dog는 오..