stride는 시작값(from)에서부터 끝값을 포함(through)하거나, 미포함(to)할 때까지 지정한 양(by)만큼 늘어나는 시퀸스를 반환하는 제네릭 함수입니다. // stride(from:to:by)는 to를 포함하지 않음 for i in stride(from: 0, to: 5, by: 1) { print(i) // 0, 1, 2, 3, 4 } // stride(from:through:by)는 through를 포함 for i in stride(from: 0, through: 5, by: 1) { print(i) // 0, 1, 2, 3, 4, 5 }
서브스크립트는 콜렉션 타입(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..
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..
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. "..