Optional이란? Swift에서 안정적인 코드를 작성하기 위해 필요한 매우 중요한 방법 중 하나입니다. Optional은 값이 있을 수도 있고 없을 수도 있는 변수의 데이터 타입입니다. 표현식을 한번 봅시다. var myNumber: Int? = nil 이와 같이 변수를 선언할 때 "?"를 사용하여 Optional을 표현합니다. 이 경우 변수에 값을 할당하지 않으면 기본값으로 nil을 반환하죠. 그러나 보통 앱을 실행하여 nil값이 나오게 되면 에러가 발생합니다. 따라서 해당값에 접근하기 위해 Optional Unwrapping 과정을 거쳐야 합니다. 옵셔널 언래핑(Optional Unwrapping)은 옵셔널의 nil 여부를 확인하고 만약에 값이 있다면 해당값을 사용하는 과정입니다. 이를 통해 n..
String Format String(format: String, _ arguments: CVarArg...) format에서는 %d , %f, %@ 이와 같은 기호를 넣어 변형이 가능하며, arguments의 여러 인수들은 $1, $2... 과 같이 취급하여 사용도 가능하다. 정수형 변환 (%d) Int형식을 변환할 때 사용합니다. (오직 정수만 사용가능) let num1 = 123 let num2 = 456 // 변화를 확인하기 위해 []로 구분을 지어줌, 사용 시 [] 제거! String(format: "[%d]", num1) // [123] // 숫자가 범위를 넘어가면 앞에 공백 (왼쪽 정렬) String(format: "[%5d]", num1) // [ 123] // 숫자가 범위를 넘어가면 뒤에..
addingPercentEncoding 지정된 CharacterSet에 포함되지 않은 문자열을 Percent Endcoing의 문자로 대체하여 새로운 문자열로 반환합니다. 일단 URL 같은 경우 공백이나 한글이 포함되면 리턴값으로 nil이 나오게 되는데요. 이때 Percent Endcoing을 통해 변환시켜 인식이 가능하도록 도와줄 수 있죠. 선언은 아래와 같이 돼있습니다. func addingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String? 여기서 CharacterSet란 유니코드 호환 문자의 집합을 나타냅니다. 여러 문자를 그룹화하여 사용을 편리하게 분류해 놓은 구조체입니다. CharacterSet에서 U..
URL URL은 특정 리소스의 위치를 나타냅니다. 보통 Sring을 통하여 접근합니다. 영어나 특수한 문자만 사용이 가능하고 한글이나 공백을 포함 시 리턴값이 nil이 나오게 됩니다. let urlStr = "https://ios-daniel-yang.tistory.com/search?keyword=iOS&page=1" let url = URL(string: urlStr)! 만약 URL에 한글 및 공백이 필요한 경우에는 String.addingPercentEncoding 변환을 통해 사용이 가능한데요. [iOS/Swift] addingPercentEncoding (URL이 nil 일 경우, URL Encoding, CharacterSet) 를 참고해 주세요. 구조 scheme 접근할 방법을 정의해 둔 프..
프로토콜 CaseIterable 공식문서 는 이쪽에 있습니다. 설명이 친절하니 한 번은 들어가서 보세요. 일단 결론은 열거형의 각각 모든 case들을 한데 묶어서 컬렉션인 배열로 만들어 줍니다. 각가의 요소를 배열로 바꾸어 준다니 유연하게 사용이 가능해질 거 같네요! 내부 구조를 한번 봅시다. public protocol CaseIterable { /// 타입의 모든 값을 콜렉션(배열로) 나타내는 타입입니다. associatedtype AllCases : Collection = [Self] where Self == Self.AllCases.Element /// 콜렉션(배열)의 모든 값을 나타냅니다. static var allCases: Self.AllCases { get } } 사용하는 곳을 열거형이라 ..
이니셜라이저 예제 아직 다루지 않은 이니셜라이저 관련 내용인데 몰랐던 내용을 예제와 함께 간단히 써볼게요. init 사용 및 고차함수 관련 내용입니다. 신기방기합니다. 문법은 다음기회에... 정리해서 올릴게요 오늘부터 저는 커피 장사를 하고 있습니다. 일단 장사를 하기 앞서 커피 메뉴판을 만들어 줬어요. struct Menu { let coffee: String let size: String } 메뉴도 만들었으니 손님 이름과 함께 주문을 받아야겠죠? struct CoffeeOrder { let name: String let order: Menu } 그런데 갑자기 손님이 들이닥쳐서 많은 주문을 처리하기 힘들어서 한눈에 보기 위해 주문 리스트도 만들어 줬어요. struct CoffeeOrderList { l..
동시성(Concurrency) 프로그래밍 만약 하나의 쓰레드에서 여러 작업(Task)을 실행하게 된다면 속도 및 성능 저하와 같은 문제가 발생하게 될 거예요. 간단한 예시로 Swift는 화면을 그릴 때(화면을 업데이트할 때) 메인 쓰레드에서 작업을 하게 됩니다. 그러면 메인 쓰레드 쪽에 작업이 많이 쌓여 있다면 화면 업데이트하는데 문제가 생기겠죠?! 이것을 해결하기 위해 나온 게 동시성입니다. 다른 쓰레드로 뿌려줘서 메인 쓰레드의 일을 분산시켜 주는 거죠. 위의 그림과 같이 작업(Task)을 큐(Queue)로 보내주기만 하면 OS(운영체제)에서 자동으로 다른 쓰레드로 분산시켜 줍니다. 우리는 작업을 효율적으로 하기 위해선 어떤 큐(Queue)를 사용할지 고민만 하면 됩니다. 큐(Queue)의 종류 Dis..
형 변환 (Type Casting) Swift에서 타입 캐스팅은 is 및 as연산자로 나눠줄 수 있습니다. is 연산자를 통하여 인스턴스에 대한 타입을 확인을 할 수가 있고 as 연산자는 클래스의 계층구조(Superclass나 Subclass)에서 변환할 타입의 인스턴스로 리턴합니다. 또한, 타입 캐스팅을 이용하여 특정 프로토콜을 따르는지 확인할 수도 있습니다. is 연산자 - Type Checking 간단히 영어 표현식으로 생각해 보면 "is"는 "~은 ~이다"라고 사용이 되죠? 영어를 읽는다 생각하고 아래 예제를 읽어보면 사용방법이 확 이해가 가실 거예요. var score: Int = 100 score is Int "score" 는 "Int" 타입이다. // true score is Double "..
Stream이란? 스트림(Stream)이란 데이터의 흐름을 의미합니다. 이러한 데이터 흐름은 단방향이며, 한번에 일부 데이터를 처리합니다. 즉, 데이터를 한번에 모두 처리하지 않고, 데이터가 하나씩 또는 여러 개씩 일정한 간격으로 생성되어 이를 연속적으로 처리하는 방식입니다. 스트림은 많은 데이터를 처리하는 경우 유용하며, 여러 개의 데이터를 처리할 때 코드의 가독성과 유지보수성이 좋아집니다. 스트림은 실시간으로 데이터를 처리하고, 데이터가 발생하는 즉시 처리할 수 있어 대규모 데이터 처리에 유용합니다. AsyncStream이란? 순서가 있고, 비동기적으로 생성된 요소들의 Sequence입니다. 클로저 내부에서 하고 싶은 일을 정의할 수 있습니다. 기존의 Sequence를 생성하려면 IteratorPro..
AsyncSequence 란 기존의 Sequence는 한 번에 하나씩, 단계별(step)로 진행할 수 있는 값 목록(list of values)입니다. 여기에 비동기성을 추가한 것이 바로 AsyncSequence입니다. 내부 구현부 먼저 AsyncSequence 내부를 살펴봅시다. @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) @rethrows public protocol AsyncSequence { // AsyncIterator는 반복을 위해 AsyncIteratorProtocol을 구현해줘야 하네요. associatedtype AsyncIterator : AsyncIteratorProtocol // 사용할 요소의 타입을 정해줄 수 있는 것..