스위프트의 where 절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다. where 절은 크게 두 가지 용도로 사용된다. 패턴과 결합하여 조건 추가 타입에 대한 제약 추가 즉 특정 패턴에 Bool 타입 조건을 지정하거나, 어떤 타입의 특정 프토코로 준수 조건을 추가하는 등의 기능이 있다. 예제를 통해서 알아보도록 하자 값 바인딩, 와일드카드 패턴과 결합한 where 절 let tuples : [(Int,Int)] = [(1,2),(1,-1),(1,0),(0,2)] for tuple in tuples { switch tuple { //값 바인딩 case let (x,y) where x==y : print("x==y") case let (x,y) where x == -y: print("x==-y") c..
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..
Comment