SWIFT
-
예전 @IBInspectable @IBDesignable 글에서 Swift에서 사용하는 @ 키워드는 컴파일러에게 추가적인 속성이 부여되었음을 알리는 역할이라고 설명한 적이 있었다. 즉, 코드에 메타 데이터 (special attribute와 directive)를 추가하는 역할을 하는 키워드라고 생각하면 된다. 이번 글에서는 @키워드를 사용한 @discardableResult에 대해 설명해보고자 한다. 1. @descardableResult 기본 개념 descardable = 버릴 수 있는, result = 결과 즉, "결과를 버릴 수 있도록 하는 속성"을 추가로 부여한다는 키워드가 @descardableResult이다. 이 키워드가 함수에서 사용되는 키워드라는 점에서 볼 때, 함수에서 해당하는 결과는 "..
[Swift] @discardableResult란 무엇일까?예전 @IBInspectable @IBDesignable 글에서 Swift에서 사용하는 @ 키워드는 컴파일러에게 추가적인 속성이 부여되었음을 알리는 역할이라고 설명한 적이 있었다. 즉, 코드에 메타 데이터 (special attribute와 directive)를 추가하는 역할을 하는 키워드라고 생각하면 된다. 이번 글에서는 @키워드를 사용한 @discardableResult에 대해 설명해보고자 한다. 1. @descardableResult 기본 개념 descardable = 버릴 수 있는, result = 결과 즉, "결과를 버릴 수 있도록 하는 속성"을 추가로 부여한다는 키워드가 @descardableResult이다. 이 키워드가 함수에서 사용되는 키워드라는 점에서 볼 때, 함수에서 해당하는 결과는 "..
2024.04.18 -
1️⃣ 내가 이 글을 쓰게 된 이유 프로그래밍을 조금이라도 배워본 사람이라면, 반복문의 대표주자로 for-in문이 있다는 것은 당연히 알 것이라 생각한다. Swift에도 당연히 for문을 지원하기에 평소 for-in 코드를 사용한 반복을 많이 사용하곤 했었는데, 반복을 목적으로 짠 코드에서 forEach문 역시 동일한 기능을 제공한다는 것을 다른 협업 팀원들의 코드에서 많이 확인할 수 있었다. 이에 그동안 나도 무지성 따라 치기(?) 스킬로 forEach라는 코드를 사용했지만, 사실 for문과 어떤 점에서 차이가 있는지, 성능 차이는 존재하는지에 대한 고찰이 없었기에 항상 공부하고 싶었던 내용이었다. 여기에 덧붙여, 최근 진행하던 프로젝트에서 iOS 멘토님에게 받은 피드백 중 하나가 "for + appe..
[Swift] for-in문과 forEach 사이의 차이, 그리고 고차함수(map, filter, reduce)의 활용까지1️⃣ 내가 이 글을 쓰게 된 이유 프로그래밍을 조금이라도 배워본 사람이라면, 반복문의 대표주자로 for-in문이 있다는 것은 당연히 알 것이라 생각한다. Swift에도 당연히 for문을 지원하기에 평소 for-in 코드를 사용한 반복을 많이 사용하곤 했었는데, 반복을 목적으로 짠 코드에서 forEach문 역시 동일한 기능을 제공한다는 것을 다른 협업 팀원들의 코드에서 많이 확인할 수 있었다. 이에 그동안 나도 무지성 따라 치기(?) 스킬로 forEach라는 코드를 사용했지만, 사실 for문과 어떤 점에서 차이가 있는지, 성능 차이는 존재하는지에 대한 고찰이 없었기에 항상 공부하고 싶었던 내용이었다. 여기에 덧붙여, 최근 진행하던 프로젝트에서 iOS 멘토님에게 받은 피드백 중 하나가 "for + appe..
2024.03.11 -
1️⃣ 빌더 패턴 (Builder Pattern)이 왜 필요하게 된 거지? 빌더 패턴 (Bulder Pattern)은 복잡한 객체를 생성하는 방법을 정의한 디자인 패턴이다. "복잡한 객체를 생성한다"는 말이 잘 와닿지 않을 수도 있어, 내가 주문했던 메뉴 중 가장 복잡했던 서브웨이 샌드위치를 예시로 들어보겠다. 서브웨이 샌드위치를 하나 시키기 위해서는 사소하게 주문해야 할 게 참 많았다. 빵은 어떤 것을 고를 거고, 치즈는 어떻게 할 거고, 야채는 어떤 것은 많이 넣고, 어떤 것은 빼고, 소스는 어떻게 하고... 등을 매번 일일이 주문하기 힘들었던 경험이 서브웨이에 한 번이라도 가본 적 있다면, 공감할 것이다. 이 상황을 iOS 개발자의 입장에서 를 객체로 바라보고 코드로 표현하면 아래와 같이 작성할 수..
[Design Pattern] 내가 보려고 정리하는 Swift 디자인 패턴 (4) - 빌더 패턴(Builder Pattern)1️⃣ 빌더 패턴 (Builder Pattern)이 왜 필요하게 된 거지? 빌더 패턴 (Bulder Pattern)은 복잡한 객체를 생성하는 방법을 정의한 디자인 패턴이다. "복잡한 객체를 생성한다"는 말이 잘 와닿지 않을 수도 있어, 내가 주문했던 메뉴 중 가장 복잡했던 서브웨이 샌드위치를 예시로 들어보겠다. 서브웨이 샌드위치를 하나 시키기 위해서는 사소하게 주문해야 할 게 참 많았다. 빵은 어떤 것을 고를 거고, 치즈는 어떻게 할 거고, 야채는 어떤 것은 많이 넣고, 어떤 것은 빼고, 소스는 어떻게 하고... 등을 매번 일일이 주문하기 힘들었던 경험이 서브웨이에 한 번이라도 가본 적 있다면, 공감할 것이다. 이 상황을 iOS 개발자의 입장에서 를 객체로 바라보고 코드로 표현하면 아래와 같이 작성할 수..
2024.02.26 -
1️⃣ 전략 패턴 (Strategy Pattern)이란? 전략 패턴(Strategy Pattern)은 특정 상황에서 사용하는 알고리즘을 캡슐화하여 런타임 내에 변경할 수 있게 해주는 디자인 패턴이다. 다시 말해, 사용되는 알고리즘을 별도의 클래스에 배치/분리하여 이 알고리즘 객체를 동적으로 교환할 수 있도록 만드는 패턴이다. 특정 상황? 알고리즘? 변경? 전략? 이 말들이 나도 처음에 잘 이해가 되지 않았기에 하나의 예시를 가지고 설명해 보겠다. 게임 캐릭터를 만드는 개발 업무를 담당하고 있다고 가정해 보자. 해당 캐릭터 클래스에는기본적으로 상대를 공격할 수 있는 attack()이라는 메서드가 포함되어 있다. 단, 캐릭터가 같은 공격을 하더라도 "공격 전략(Attack Strategy)"은 여러 개를 ..
[Design Pattern] 내가 보려고 정리하는 Swift 디자인 패턴 (3) - 전략 패턴(Strategy Pattern)1️⃣ 전략 패턴 (Strategy Pattern)이란? 전략 패턴(Strategy Pattern)은 특정 상황에서 사용하는 알고리즘을 캡슐화하여 런타임 내에 변경할 수 있게 해주는 디자인 패턴이다. 다시 말해, 사용되는 알고리즘을 별도의 클래스에 배치/분리하여 이 알고리즘 객체를 동적으로 교환할 수 있도록 만드는 패턴이다. 특정 상황? 알고리즘? 변경? 전략? 이 말들이 나도 처음에 잘 이해가 되지 않았기에 하나의 예시를 가지고 설명해 보겠다. 게임 캐릭터를 만드는 개발 업무를 담당하고 있다고 가정해 보자. 해당 캐릭터 클래스에는기본적으로 상대를 공격할 수 있는 attack()이라는 메서드가 포함되어 있다. 단, 캐릭터가 같은 공격을 하더라도 "공격 전략(Attack Strategy)"은 여러 개를 ..
2024.02.25 -
[UIKit] 재사용 Component 개발하기 (1) - Toast Message 💡 재사용 Component 개발하기 시리즈 글을 시작하며 이번 33기 앱잼이었던 프로젝트에서 우리 iOS 팀이 추구한 방향 중 하나는, 앱 내에서 반복되는 컴포넌트(내비게이션바, 바텀시트, 알림 창, 토 mini-min-dev.tistory.com 1️⃣ HIG 살펴보기 : 팝업창(Alerts)이란? 보통 팝업창으로 알고 있는 알림창을 iOS 공식문서에서는 정확하게 Alerts라고 부른다. Alerts는 사용자에게 "중요한 문제를 알리는 용도"로 사용한다. 여기서 말하는 "중요한 문제"란 해당 작업으로 데이터가 파괴될 수 있는 경우, 새롭게 시작하는 혹은 앱 안에서 발생한 어떤 중요한 작업에 대해 사용자에게 알리기 위한..
[UIKit] 재사용 Component 개발하기 (2) - 팝업창 (Alerts)[UIKit] 재사용 Component 개발하기 (1) - Toast Message 💡 재사용 Component 개발하기 시리즈 글을 시작하며 이번 33기 앱잼이었던 프로젝트에서 우리 iOS 팀이 추구한 방향 중 하나는, 앱 내에서 반복되는 컴포넌트(내비게이션바, 바텀시트, 알림 창, 토 mini-min-dev.tistory.com 1️⃣ HIG 살펴보기 : 팝업창(Alerts)이란? 보통 팝업창으로 알고 있는 알림창을 iOS 공식문서에서는 정확하게 Alerts라고 부른다. Alerts는 사용자에게 "중요한 문제를 알리는 용도"로 사용한다. 여기서 말하는 "중요한 문제"란 해당 작업으로 데이터가 파괴될 수 있는 경우, 새롭게 시작하는 혹은 앱 안에서 발생한 어떤 중요한 작업에 대해 사용자에게 알리기 위한..
2024.02.24 -
1️⃣ Delegate가 등장하게 된 이유 Delegate는 "대리자" "위임하다" 같은 뜻으로 번역되는 단어다. "위임하다"의 의미를 구체적으로 들어가보면, "당사자의 일방이 상대방에 대하여 '사무의 처리'를 위탁하고, 상대방이 이를 승낙함으로써 성립하는 것"이라고 한다. 즉, 쉽게 말해 Delegate는 "너가 나 대신 일 좀 해줘!" 라는 의미를 가지고 있는 단어다. (전문용어로 짬 때린다) "본인 일을 본인이 하면 되지 왜 남한테 떠넘겨?" 라고 할 수도 있지만, 사실 이 Delegate가 필요하게 된 상황을 보게되면 공감이 될 거다. 프랜차이즈 햄버거 가게 사장이 되었다고 예시를 들어보겠다. 불고기 버거와 치킨 버거 두 가지 메뉴만 판매하는 가게에서 햄버거 레시피는 우리 가게 프랜차이즈의 특성을..
[Design Pattern] 내가 보려고 정리하는 Swift 디자인 패턴 (2) - Delegate Pattern1️⃣ Delegate가 등장하게 된 이유 Delegate는 "대리자" "위임하다" 같은 뜻으로 번역되는 단어다. "위임하다"의 의미를 구체적으로 들어가보면, "당사자의 일방이 상대방에 대하여 '사무의 처리'를 위탁하고, 상대방이 이를 승낙함으로써 성립하는 것"이라고 한다. 즉, 쉽게 말해 Delegate는 "너가 나 대신 일 좀 해줘!" 라는 의미를 가지고 있는 단어다. (전문용어로 짬 때린다) "본인 일을 본인이 하면 되지 왜 남한테 떠넘겨?" 라고 할 수도 있지만, 사실 이 Delegate가 필요하게 된 상황을 보게되면 공감이 될 거다. 프랜차이즈 햄버거 가게 사장이 되었다고 예시를 들어보겠다. 불고기 버거와 치킨 버거 두 가지 메뉴만 판매하는 가게에서 햄버거 레시피는 우리 가게 프랜차이즈의 특성을..
2024.02.20 -
1️⃣ static : 타입 프로퍼티 (Type Property) 개념 정리 Swift의 static 키워드는 인스턴스 생성 여부와 상관없이 무조건 1개의 값만 존재하는 프로퍼티를 선언할 때 사용한다. 객체 지향 프로그래밍에서 처음 내가 어렵게 느꼈던 부분은 한 행위 또는 내용물에 대해 여러 표현법을 사용한다는 점이었다. 그래서 이 글을 읽는 다른 사람들은 과거의 나 같은 어려움을 느끼지 않았으면 하는 마음에서, 용어를 먼저 정리해보고자 한다. 인스턴스 = 클래스 혹은 구조체에서 찍어낸 결과물 = 붕어빵 틀에서 만들어진 붕어빵 = 객체 (매우 중요!) 생성 = 클래스 혹은 구조체에서 결과물을 찍어냄 = 변수 또는 상수에 클래스/구조체를 기반으로 한 값을 대입함 = 클래스/구조체에서 비롯된 객체가 메모리에..
[Design Pattern] 내가 보려고 정리하는 Swift 디자인 패턴 (1) - 싱글톤 패턴(Singleton Pattern)1️⃣ static : 타입 프로퍼티 (Type Property) 개념 정리 Swift의 static 키워드는 인스턴스 생성 여부와 상관없이 무조건 1개의 값만 존재하는 프로퍼티를 선언할 때 사용한다. 객체 지향 프로그래밍에서 처음 내가 어렵게 느꼈던 부분은 한 행위 또는 내용물에 대해 여러 표현법을 사용한다는 점이었다. 그래서 이 글을 읽는 다른 사람들은 과거의 나 같은 어려움을 느끼지 않았으면 하는 마음에서, 용어를 먼저 정리해보고자 한다. 인스턴스 = 클래스 혹은 구조체에서 찍어낸 결과물 = 붕어빵 틀에서 만들어진 붕어빵 = 객체 (매우 중요!) 생성 = 클래스 혹은 구조체에서 결과물을 찍어냄 = 변수 또는 상수에 클래스/구조체를 기반으로 한 값을 대입함 = 클래스/구조체에서 비롯된 객체가 메모리에..
2024.02.19 -
0️⃣ OOP(Object-Oriented Programming)와 SOLID 원칙 "일단 앱잼 기간 중에 빨리 기능부터 구현하고, 우리 앱잼 끝나면 진짜 리팩토링하자!" 단기간에 결과물을 내야하는 솝트 동아리 내의 과제, 합동 세미나, 장기 해커톤 앱잼 같은 곳에서 가장 많이 들었고, 가장 많이 해온 말이다. 하지만 해당 기능 개발이 끝나면, 또 다른 기능 개발이 개발자들을 기다리고 있고.... 또 다른 기능 구현을 우선적으로 하다 보면, 코드 정리나 프로젝트의 구조를 개선하는 일은 후순위가 항상 되기 마련이었다. 어쩌면 리팩토링은 평생 동안 목표에 그칠 수밖에 없는 "이룰 수 없는 과제"일지도 모르겠다. 그래서 나는 여기서 의문을 하나 가지게 되었다. "겉으로 보이지 않는 코드의 퀄리티나 프로그램의 ..
[Clean Architecture] OOP의 SOLID 원칙을 Swift의 관점에서 이해하기0️⃣ OOP(Object-Oriented Programming)와 SOLID 원칙 "일단 앱잼 기간 중에 빨리 기능부터 구현하고, 우리 앱잼 끝나면 진짜 리팩토링하자!" 단기간에 결과물을 내야하는 솝트 동아리 내의 과제, 합동 세미나, 장기 해커톤 앱잼 같은 곳에서 가장 많이 들었고, 가장 많이 해온 말이다. 하지만 해당 기능 개발이 끝나면, 또 다른 기능 개발이 개발자들을 기다리고 있고.... 또 다른 기능 구현을 우선적으로 하다 보면, 코드 정리나 프로젝트의 구조를 개선하는 일은 후순위가 항상 되기 마련이었다. 어쩌면 리팩토링은 평생 동안 목표에 그칠 수밖에 없는 "이룰 수 없는 과제"일지도 모르겠다. 그래서 나는 여기서 의문을 하나 가지게 되었다. "겉으로 보이지 않는 코드의 퀄리티나 프로그램의 ..
2024.02.13 -
1️⃣ 이번 글에서 구현하고자 하는 기능은? 이번 글에서 구현할 기능은 예전에도 한번 구현해 본 경험이 있던 컬렉션 뷰에서 특정 Cell을 꾹 눌러 드래그할 때, Cell의 순서를 바꿀 수 있는 Drag & Drop 기능이다. 사실 이 내용은 예전에도 한번 다룬적이 있던 내용이다. (당시 썼던 글 내용이 궁금하다면, 아래 링크를 타고 넘어가봐도 좋다 ^__^) [UITableView] 테이블 뷰 Drag & Drop으로 cell 위치 바꾸기 그동안 맥북을 수리 맡기느라 iOS 관련 포스팅을 못하고 있었다. 거의 1주반에 달하는 긴 기다림의 시간이 지나고, 다시 달려보려고 한다🌊 오늘 다룰 Challenge는 테이블 뷰를 드래그 앤 드롭해서 mini-min-dev.tistory.com 당시 글에서는 테이블..
[UICollectionView] Drag & Drop cell 위치 변경, Delegate로 구현하기1️⃣ 이번 글에서 구현하고자 하는 기능은? 이번 글에서 구현할 기능은 예전에도 한번 구현해 본 경험이 있던 컬렉션 뷰에서 특정 Cell을 꾹 눌러 드래그할 때, Cell의 순서를 바꿀 수 있는 Drag & Drop 기능이다. 사실 이 내용은 예전에도 한번 다룬적이 있던 내용이다. (당시 썼던 글 내용이 궁금하다면, 아래 링크를 타고 넘어가봐도 좋다 ^__^) [UITableView] 테이블 뷰 Drag & Drop으로 cell 위치 바꾸기 그동안 맥북을 수리 맡기느라 iOS 관련 포스팅을 못하고 있었다. 거의 1주반에 달하는 긴 기다림의 시간이 지나고, 다시 달려보려고 한다🌊 오늘 다룰 Challenge는 테이블 뷰를 드래그 앤 드롭해서 mini-min-dev.tistory.com 당시 글에서는 테이블..
2024.02.01 -
0️⃣ 이번 리팩토링의 목적! 어쩌다 보니 커스텀 탭바를 구현하면서 공부한 내용이 시리즈 형식으로 쓰이게 되었는데, 어느덧 세 번째 글을 쓸 차례이다. 사실 두 번째 글에서부터 이어진 내용이긴 한데, 이번 리팩토링은 각각의 뷰들이 커스텀 탭바의 각 탭들을 클릭했을 때 개별적으로 표출되도록 구현했던 화면을, 하나의 스크롤 뷰 위에 모두 포함시키고 그에 따른 커스텀 탭바의 자연스러운 액션 (스크롤 위치에 따라 탭바가 움직이는 기능 + 각 탭을 클릭했을 때 자동으로 해당 위치까지 스크롤되는 기능)까지 주도록 변경하는 것이 목적이었다. 이 리팩토링을 위해 앞에서 StickyHeader도 적용을 시켰던 것이었기에, 이번 글에서는 추가적으로 남은 탭바의 자연스러운 액션을 구현하도록 한 부분에 대한 설명을 이어서 써..
[UIScrollView] 상단 커스텀 탭바를 만들어봅시다! (3) - 특정 위치 자동 스크롤 기능 추가0️⃣ 이번 리팩토링의 목적! 어쩌다 보니 커스텀 탭바를 구현하면서 공부한 내용이 시리즈 형식으로 쓰이게 되었는데, 어느덧 세 번째 글을 쓸 차례이다. 사실 두 번째 글에서부터 이어진 내용이긴 한데, 이번 리팩토링은 각각의 뷰들이 커스텀 탭바의 각 탭들을 클릭했을 때 개별적으로 표출되도록 구현했던 화면을, 하나의 스크롤 뷰 위에 모두 포함시키고 그에 따른 커스텀 탭바의 자연스러운 액션 (스크롤 위치에 따라 탭바가 움직이는 기능 + 각 탭을 클릭했을 때 자동으로 해당 위치까지 스크롤되는 기능)까지 주도록 변경하는 것이 목적이었다. 이 리팩토링을 위해 앞에서 StickyHeader도 적용을 시켰던 것이었기에, 이번 글에서는 추가적으로 남은 탭바의 자연스러운 액션을 구현하도록 한 부분에 대한 설명을 이어서 써..
2023.12.12 -
1️⃣ Nib와 Xib 핵심 내용만 정리해보기 Nib와 Xib 두 개 모두 iOS 화면을 구성하기 위한 파일이다. Nib : Nextstep Interface Builder의 줄임말, 바이너리 파일 (데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일, 사람은 읽지 못하고 컴퓨터만 읽을 수 있는 언어)이다. Xib : Xml Interface Builder의 줄임말, Xml 파일 (데이터들을 쉽게 구조화해서 전달하기 위해 만들어진 언어가 xml이고 이 xml로 쓰여진 파일이 xml 파일, 컴퓨터와 사람 모두 읽을 수 있는 언어)이다. 2️⃣ Nib와 Xib 핵심 내용에서 살을 더 붙여보자! ✔️ 새로운 Cocoa Touch Class 파일을 만들 때, "Also create XIB f..
[iOS] iOS 화면을 구성하는 파일, Nib와 Xib 개념 정리해보기1️⃣ Nib와 Xib 핵심 내용만 정리해보기 Nib와 Xib 두 개 모두 iOS 화면을 구성하기 위한 파일이다. Nib : Nextstep Interface Builder의 줄임말, 바이너리 파일 (데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일, 사람은 읽지 못하고 컴퓨터만 읽을 수 있는 언어)이다. Xib : Xml Interface Builder의 줄임말, Xml 파일 (데이터들을 쉽게 구조화해서 전달하기 위해 만들어진 언어가 xml이고 이 xml로 쓰여진 파일이 xml 파일, 컴퓨터와 사람 모두 읽을 수 있는 언어)이다. 2️⃣ Nib와 Xib 핵심 내용에서 살을 더 붙여보자! ✔️ 새로운 Cocoa Touch Class 파일을 만들 때, "Also create XIB f..
2023.10.08 -
[iOS] 스톱워치 앱 만들기 (3) - 테이블 뷰에 랩 타임 추가하기 [iOS] 스톱워치 앱 만들기 (2) - 버튼 클릭에 따른 상태 변화 기능 구현 [iOS] 스톱워치 앱 만들기 (1) - 프로젝트 기본 세팅과 Timer에 대한 이해 오랜만에 써보는 iOS 개발 글이다. 오지 않을 것만 같던 mini-min-dev.tistory.com 이번 글에서는 내가 스톱워치 앱을 만들기로 한 가장 주된 이유인, "Copy Paste 기능"을 구현해 보도록 하겠다. 갤럭시에서는 테이블 뷰에 랩 타임이 나와있으면 이를 쉽게 복사해서 기록을 공유할 수 있는 것에 반해, 아이폰 스톱워치에는 그 기능이 없어 내가 실제로 군대에서 어려움을 겪었다. (스톱워치를 사용할 때마다 갤럭시 찾기....) 그게 답답했던 나는 이번 ..
[iOS] 스톱워치 앱 만들기 (4) - UIEditMenuInteraction과 UIPasteboard[iOS] 스톱워치 앱 만들기 (3) - 테이블 뷰에 랩 타임 추가하기 [iOS] 스톱워치 앱 만들기 (2) - 버튼 클릭에 따른 상태 변화 기능 구현 [iOS] 스톱워치 앱 만들기 (1) - 프로젝트 기본 세팅과 Timer에 대한 이해 오랜만에 써보는 iOS 개발 글이다. 오지 않을 것만 같던 mini-min-dev.tistory.com 이번 글에서는 내가 스톱워치 앱을 만들기로 한 가장 주된 이유인, "Copy Paste 기능"을 구현해 보도록 하겠다. 갤럭시에서는 테이블 뷰에 랩 타임이 나와있으면 이를 쉽게 복사해서 기록을 공유할 수 있는 것에 반해, 아이폰 스톱워치에는 그 기능이 없어 내가 실제로 군대에서 어려움을 겪었다. (스톱워치를 사용할 때마다 갤럭시 찾기....) 그게 답답했던 나는 이번 ..
2023.07.07