Swift는 타입 내부에 타입을 정의할 수 있다. 예를 들어 열거형의 경우 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이하다. 열거형을 기준으로 분기하거나, 기능을 달리할 수 있다. 또는 특정 데이터 타입들을 하나의 클래스나 구조체에 구현하여 외부와의 혼선을 피할 수도 있다. 중첩 데이터 타입 클래스 내부에 새 클래스, 구조체 내부에 새 구조체, 구조체 내부에 새 열거형 등 타입 내부에 타입을 계속해서 정의할 수 있다. struct Car { let model : String let fuel : Fuel enum Fuel { case LPG case GASOLINE case CNG case ELETRIC } } struct AirPlane { let model:String let fuel : Fu..

제네릭은 스위프트나 Java, Kotlin 같은 언어들의 강력한 기능으로, 어떤 타입에도 유연하게 대응할 수 있는 자료구조나 함수, 사용자 정의 클래스를 만드는데 아주 유용하게 사용되는 기능이다. 엄청나게 중요한 기능으로 꼭 익혀두어야 한다. 이미 우리가 사용한 많은 기능들이 이미 제네릭을 사용한 기능들이다. 예를 들어 Array 나 Set, Dictionary 의 경우 어떤 타입을 넣더라도 배열이나 집합, 사전으로 만들 수 있었다. 이것은 모두 제네릭이 적용되었기에 가능하다. 또 Optional 도 원래는 열거형으로 구현되있으며, 어떤 타입이든 Optional 로 표현할 수 있다. 제네릭이 적용된 Optional 의 정의를 보자 @frozen public enum Optional : Expressibl..
Swift에선 프로토콜 지향 프로그래밍이 매우 중요하게 여겨진다. 이번 포스트에선 프로토콜에 대해 공부한 내용을 적어보도록 하겠다. Protocol이란? 프로토콜은 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진(설계도) 를 의미한다. 구조체, 클래스, 열거형은 정의된 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 직접 구현할 수 있다. 프로토콜의 요구사항을 모두 따르는 타입은 해당 프로토콜을 준수한다고 표현한다. 프로토콜은 설계도 역할을 할 뿐이므로, 스스로 기능을 구현하진 않는다. Protocol 정의 & 채택하기 Swift 에서 프로토콜은 protocol 키워드를 사용하여 정의할 수 있다. protocol 프로토콜 이름 { 프로토콜 요구사항 } 클래스, 구..
클래스나 구조체, 열거형에는 컬렉션,리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법인 서브스크립트를 정의할 수 있다. 서브스크립트는 별도의 setter 나 getter 를 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있다. 예를 들어 Dictionary 나 Array 같은 자료형의 경우 arr[index] 나 dictionary[key] 의 표현을 통해서 값을 가져오거나 값을 할당할 수 있다. 이런 것을 서브스크립트라 하는데, 개발자가 한 타입에 여러 개의 서브스크립트를 정의할 수 있으며, 다른 타입을 인덱스로 갖는 여러 개의 서브스크립트를 중복 정의할 수도 있다. 사용자 정의 클래스, 구조체, 열거형에 서브스크립트를 정의할 수 있으며, 서브스크립트를 통해 타입의 데이터를 가져올 수 있..
스위프트나 코틀린 같은 함수형 패러다임 언어는 컬렉션을 가공하는 수많은 유용한 함수를 제공해준다. 예를 들어 배열에서 특정 조건을 만족하는 요소만 담아서 새로운 배열을 만들어준다던가, 배열의 모든 요소에 특정 작업을 수행할 수 있다. 스위프트에서 유용한 고차함수로 Map, Filter, Reduce 가 있는데, 이것을 활용해 데이터 연산을 쉽게 해보자! Map 맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수이다 Swift 에서 map 함수는 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다. map 을 사용하면 컨테이너가 담고 있던 각각의 값을 매개변수로 전달한 함수를 실행시켜 새로운 값으로 변환하고 다시 컨테이너에..

백준 프로필의 IOS 버전을 개발하던 도중, 티어 배지를 Swift UI 의 Shape 프로토콜을 사용하는 커스텀 도형으로 직접 구현해보기로 하였다. 티어 배지는 위와 같이 생겼으며, 물론 어도비 XD 를 이용해 svg파일을 직접 추출해도 되지만 6가지의 티어 (브론즈, 실버, 골드, 플래티넘, 다이아, 루비) 색상과, 1~5단계에 해당하는 티어 단계로 인해 만약 위와 같은 방식으로 구현할 경우 총 30가지의 svg 파일을 추출해야 한다. Android 버전은 티어 단계를 텍스트 뷰로 구현해 총 6가지의 svg 파일만으로 구현을 완료했지만, IOS 버전에서는 직접 저 모양을 그려서 구현해보았다. Swift UI Shape 프로토콜 Swift UI 에서 사각형, 원, 둥근 사각형 등은 각각 Rectangl..

Swift 에서 옵셔널은 nil 값에 대해 안전한 처리를 가능하게 한다. 옵셔널로 선언된 변수나 상수는 항상 옵셔널 바인딩이나 nil 체크를 통해 값을 꺼내야 하며, 컴파일러가 항상 이것을 체크한다. Swift 옵셔널 옵셔널 (Optional) 이란 말 그대로 선택적인, 즉 값이 있을 수도 없을 수도 있다는 것을 나타낸다. 즉 프로그래밍 언어에서는 상수나 변수가 값을 가질 수도, 없을 수도(null) 있다는 것을 의미하고, N forstudy.tistory.com 옵셔널을 사용하면 오류 방지엔 뛰어나겠지만, 만약 옵셔널 안의 옵셔널 안의 옵셔널 안의 옵셔널 안의 상수를 꺼낸다고 할 때 무슨 마트료시카 인형을 여는 것 마냥 매우 많은 코드를 생성해야 하고 이는 개발자 입장에서 매우 귀찮은 일이다. if l..

코딩테스트 연습 - 불량 사용자 개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 programmers.co.kr 밴 아이디에 매칭되는 유저 아이디 찾기 밴 아이디의 조합의 개수를 묻는 문제이기 때문에, 우선 각 밴 아이디가 매칭되는 문자열들을 찾아야 한다. 응모자 아이디와 밴 아이디가 다음과 같다고 할 때, 유저 아이디 밴 문자열 frodo fr*d* fradi abc1** crodo abc123 frodoc "fr*d*" 라는 밴 문자열은 "frodo","fradi" 라는 두 개의 유저 아이디와 매칭된다. 또 abc1** 은 abc123 이라는 단 한 개의 문자열과 매칭..
Comment