여러분은 이미 Swift에서 패턴 매칭을 많이 사용해왔을 겁니다. 예를 들어 if let으로 옵셔널 바인딩을 하거나, switch 문에서 특정 값을 비교하는 것이 모두 패턴 매칭의 일종입니다. 하지만 Swift의 패턴 매칭은 단순한 값 비교를 넘어, 복잡한 데이터 구조의 형태를 분석하고, 그 안의 값을 추출하며, 특정 조건을 만족하는 경우에만 코드를 실행할 수 있는 매우 정교한 기능을 제공합니다. 이를 통해 코드를 더욱 간결하고 표현력이 풍부하게 만들 수 있습니다.
2025/07/22
2025/07/21
16. Swift 클로저 심층 분석: 캡처 리스트와 순환 참조 문제 해결
클로저는 코드 블록을 변수처럼 전달하고 저장할 수 있게 해주는 Swift의 핵심 기능입니다. 비동기 작업, 애니메이션, UI 이벤트 처리 등 다양한 곳에서 클로저를 사용하지만, 그 내부 동작, 특히 외부 변수를 '캡처'하는 메커니즘을 제대로 이해하지 못하면 메모리 누수로 이어지는 순환 참조라는 함정에 빠질 수 있습니다.
14. Swift 익스텐션(Extension): 기존 타입에 새로운 기능 추가하기
개발을 하다 보면 기존에 정의된 클래스, 구조체, 열거형, 또는 심지어 기본 타입(Int, String 등)에 새로운 기능을 추가하고 싶을 때가 있습니다. 하지만 원본 소스 코드를 수정할 수 없거나, 수정하는 것이 바람직하지 않은 경우가 많죠. 이럴 때 익스텐션이 빛을 발합니다. 익스텐션은 기존 타입의 기능을 확장하여, 마치 원래부터 그 타입에 있었던 것처럼 사용할 수 있게 해주는 아주 유용한 방법입니다.
2025/07/20
12. Swift 오류 처리(Error Handling): 견고한 앱을 만드는 필수 요소
안녕하세요! 지난 블로그에서는 코드의 유연성과 확장성을 높이는 설계도, 프로토콜에 대해 알아보며 Swift다운 프로그래밍 패러다임을 이해했습니다. 오늘은 여러분이 만드는 앱을 더욱 견고하고 안정적으로 만들어 줄, 바로 오류 처리(Error Handling)에 대해 깊이 파고들 것입니다. 🛡️
프로그램을 만들다 보면 예상치 못한 상황이 발생하곤 합니다. 예를 들어, 존재하지 않는 파일을 열려고 하거나, 네트워크 연결이 끊기거나, 유효하지 않은 입력값을 받거나 하는 경우들이죠. 이러한 상황을 적절하게 처리하지 않으면 앱이 강제로 종료(크래시)되어 사용자 경험을 심각하게 해칠 수 있습니다. Swift는 이러한 오류(Error) 상황을 우아하고 안전하게 다룰 수 있는 메커니즘을 제공합니다.
2025/07/19
11. Swift 프로토콜(Protocol): 규약을 정의하고 기능을 확장하는 설계도
프로토콜은 마치 건축물의 '설계도'와 같습니다. 실제 건물을 짓기 전에, 어떤 구조를 가지고 어떤 기능을 해야 할지 미리 약속해두는 것처럼, 프로토콜은 특정 기능을 수행하기 위해 타입이 갖춰야 할 요구사항(규약)을 정의합니다. 클래스, 구조체, 열거형은 이 프로토콜을 '채택(Adopt)'하여 설계도에 명시된 요구사항을 실제로 구현합니다.
프로토콜을 통해 우리는 코드의 유연성과 확장성을 크게 높일 수 있으며, 다형성(Polymorphism)을 구현하는 데 상속보다 더 강력하고 안전한 대안을 제공합니다.
10. Swift 초기화(Initialization): 인스턴스를 안전하게 생성하는 법
초기화는 단순히 객체를 '만드는' 과정을 넘어, 인스턴스가 사용되기 전에 모든 저장 프로퍼티가 적절한 초기 값을 가지도록 보장하는 중요한 역할을 합니다. 이는 Swift의 강력한 타입 안전성 원칙의 핵심이며, 여러분의 앱에서 발생할 수 있는 잠재적인 오류를 미리 방지하는 데 필수적입니다.
2025/07/16
9. Swift 상속(Inheritance): 코드 재사용성을 높이는 방법
안녕하세요!
지난 블로그에는 객체의 속성을 정의하는 프로퍼티와 동작을 정의하는 메서드에 대해 알아보며 클래스와 구조체를 더욱 풍부하게 만드는 방법을 익혔죠. 오늘은 객체 지향 프로그래밍의 가장 강력한 기능 중 하나이자 코드 재사용성의 꽃이라고 할 수 있는 상속(Inheritance)에 대해 깊이 파고들 것입니다.
상속은 마치 부모가 자녀에게 유전자를 물려주듯이, 기존 클래스의 특성과 기능을 새로운 클래스가 물려받아 자신의 것처럼 사용할 수 있게 해주는 메커니즘입니다. 이를 통해 우리는 이미 잘 만들어진 코드를 재활용하고, 거기에 새로운 기능을 추가하거나 기존 기능을 변경하여 더욱 효율적이고 유연한 프로그램을 만들 수 있습니다.
2025/07/12
7. Swift 열거형(Enum): 관련된 값들을 하나의 타입으로 묶는 방법
열거형은 단순히 값들을 나열하는 것을 넘어, 코드의 실수를 줄이고 의미를 명확하게 전달하는 데 큰 도움을 줍니다. 마치 여러 옵션이 있는 메뉴판처럼, 정해진 선택지 안에서만 값을 선택하도록 강제함으로써 예측 불가능한 상황을 방지하고 코드의 안정성을 높여줍니다.
2025/07/09
6. Swift 구조체(Struct)와 클래스(Class): Swift 객체 지향 프로그래밍의 핵심
5. Swift 컬렉션 타입: 배열(Array)과 딕셔너리(Dictionary) 마스터하기
Swift는 데이터를 효율적으로 저장하고 접근할 수 있도록 세 가지 주요 컬렉션 타입을 제공합니다.
배열(Array), 세트(Set), 그리고 딕셔너리(Dictionary). 이 세 가지 중에서 오늘은 가장 빈번하게 사용되는 배열과 딕셔너리에 집중하여 마스터하는 시간을 갖겠습니다. 이들을 잘 활용하면 복잡한 데이터도 깔끔하게 정리하고 원하는 대로 다룰 수 있습니다.
2025/07/05
4. Swift 옵셔널(Optional): nil 안전하게 다루는 법
nil
오류로부터 안전하게 코드를 작성할 수 있도록 돕는 핵심적인 도구입니다.null
또는 nil
값 때문에 런타임 오류(앱 크래시)가 발생하는 경우가 많지만, Swift는 옵셔널을 통해 이러한 위험을 사전에 방지할 수 있도록 설계되었습니다.3. Swift 함수와 클로저: 재사용 가능한 코드 블록 만들기
2. Swift의 흐름 제어: 조건문(if, switch)과 반복문(for, while) 완전 정복
2025/07/02
1. Swift 시작하기: 변수, 상수, 그리고 데이터 타입의 모든 것
오늘은 Swift 프로그래밍의 가장 기본적인 요소인 변수(Variables), 상수(Constants), 그리고 데이터 타입(Data Types)에 대해 나름 정리해 보겠습니다. 이 개념들을 확실히 이해해야 앞으로 Swift로 만들 모든 코드의 단단한 기초가 될 수 있을 것입니다.
1. 변수 (Variables): 변할 수 있는 값들의 보관함
프로그래밍에서 변수는 값을 저장하는 공간이라고 생각하면 쉽습니다. 이 공간에 저장된 값은 프로그램이 실행되는 동안 언제든지 변경될 수 있습니다. Swift에서 변수를 선언할 때는 var
키워드를 사용합니다.
💡 왜 사용할까요? 사용자의 입력값, 계산 결과, 실시간으로 변하는 상태(예: 게임 점수, 현재 시간) 등을 저장할 때 유용합니다.
Swift 예시
var welcomeMessage = "안녕하세요, Swift 세계에 오신 것을 환영합니다!"
print(welcomeMessage) // 출력: 안녕하세요, Swift 세계에 오신 것을 환영합니다!
welcomeMessage = "다시 만나서 반갑습니다!" // 값 변경
print(welcomeMessage) // 출력: 다시 만나서 반갑습니다!
var userScore = 0 // 게임 점수
print("현재 점수: \(userScore)")
userScore = 100 // 점수 증가
print("새로운 점수: \(userScore)")
위 예시에서 welcomeMessage
와 userScore
는 var
로 선언되었기 때문에 나중에 다른 값으로 변경할 수 있습니다.
2. 상수 (Constants): 한 번 정하면 변하지 않는 값
변수와 달리 상수는 한 번 값이 할당되면 프로그램이 끝날 때까지 그 값을 절대 변경할 수 없습니다. Swift에서 상수를 선언할 때는 let
키워드를 사용합니다.
💡 왜 사용할까요? 변하지 않는 고정된 값(예: 수학에서의 파이(π) 값, 앱 버전 번호, 고정된 메시지)을 저장하여 코드의 안정성을 높이고, 실수를 줄이는 데 도움이 됩니다. Swift는 기본적으로 상수를 사용하는 것을 권장합니다.
📝 Swift 코드 예시:
let maximumNumberOfLoginAttempts = 3 // 최대 로그인 시도 횟수
print("최대 로그인 시도 횟수: \(maximumNumberOfLoginAttempts)")
let companyName = "Apple Inc." // 회사 이름
print("회사 이름: \(companyName)")
// maximumNumberOfLoginAttempts = 5 // 에러 발생! 상수는 값을 변경할 수 없습니다.
maximumNumberOfLoginAttempts
와 companyName
은 let
으로 선언되었으므로 값을 변경하려고 하면 컴파일 에러가 발생합니다. 이는 개발자의 의도치 않은 값 변경을 방지하여 코드의 견고함을 높여줍니다.
3. 데이터 타입 (Data Types): 값의 종류를 알려주는 분류표
Swift는 타입에 안전한(Type-safe) 언어입니다. 이는 Swift가 모든 변수와 상수에 저장되는 값의 데이터 타입을 명확하게 알고 있다는 의미입니다. 데이터 타입은 그 값이 숫자(정수, 소수), 문자, 참/거짓 등 어떤 종류의 값인지를 Swift에게 알려줍니다.
Swift는 대부분의 경우 개발자가 타입을 명시하지 않아도 초기값을 보고 스스로 타입을 추론(Type Inference)합니다. 하지만 필요하다면 직접 타입을 명시할 수도 있습니다.
💡 주요 데이터 타입:
- Int (Integer): 정수를 저장합니다. (예:
10
,-5
,0
) - Double (Double-precision floating-point number): 부동 소수점(실수)을 저장합니다. 더 넓은 범위와 정밀도를 가집니다. (예:
3.14
,-0.5
,100.0
) - Float (Single-precision floating-point number):
Double
보다 적은 메모리를 사용하지만 정밀도가 낮습니다. (잘 사용되지 않음) - Bool (Boolean): 참(
true
) 또는 거짓(false
) 두 가지 값만 가집니다. 조건문에서 많이 사용됩니다. - String (String of characters): 텍스트 문자열을 저장합니다. (예:
"Hello"
,"Swift Programming"
) - Character: 단일 문자를 저장합니다. (예:
'A'
,'😀'
)
📝 Swift 코드 예시 (타입 추론 및 명시):
// 타입 추론 (Swift가 알아서 타입을 결정)
var age = 30 // Int로 추론
let pi = 3.14159 // Double로 추론
var isLoggedIn = true // Bool로 추론
let appName = "MyAwesomeApp" // String으로 추론
// 타입 명시 (개발자가 직접 타입을 지정)
var temperature: Double = 25.5
let statusCode: Int = 200
var isEnabled: Bool = false
let greeting: String = "안녕하세요"
// 주의: 다른 타입의 값을 할당할 수 없습니다.
// temperature = "스물다섯점오" // 에러 발생! String을 Double 변수에 할당할 수 없습니다.
정리하며
오늘은 Swift 프로그래밍의 가장 기본적인 세 가지 요소, 즉 값을 저장하는 공간인 변수(var
) 와 상수(let
), 그리고 값의 종류를 나타내는 데이터 타입에 대해 알아보았습니다.
var
: 값이 변할 수 있는 데이터를 저장할 때 사용합니다.let
: 한 번 할당되면 변하지 않는 데이터를 저장할 때 사용합니다. (Swift는let
사용을 권장합니다!)- 데이터 타입: 저장되는 값의 종류를 명시하며, Swift의 타입 안전성을 보장합니다.
이 개념들을 잘 이해하고 나면, 다음 단계로 나아갈 준비가 된 것입니다. 다음 블로그에서는 Swift의 흐름 제어(조건문과 반복문)에 대해 자세히 알아보도록 하겠습니다.
내용 중에 틀린 부분이 있으면 댓글로 알려주세요.
2025/06/01
iOS 개발자 학습 로드맵: Swift, SwiftUI, 외부 기기 연동 정복하기 🚀
iOS 개발자가 되기 위한 여정을 응원합니다! Swift, SwiftUI, 그리고 외부 기기 연동 기술을 빠르고 정확하게 습득하기 위한 체계적인 학습 로드맵을 안내해 드립니다.
1단계: Swift 언어 기초 다지기
가장 먼저 iOS 앱 개발의 핵심 언어인 Swift에 대한 탄탄한 이해가 필요합니다.
- 핵심 문법 학습: 변수, 상수, 데이터 타입, 연산자, 제어문(조건문, 반복문), 함수, 옵셔널 등 Swift의 기본적인 문법을 익힙니다.
- 추천 자료:
- Apple 공식 Swift Programming Language 가이드
- 온라인 강의
- Udemy iOS Development Courses Online
- Coursera Best iOS App Development Courses & Certificates [2025]
- Inflearn iOS
- Fastcampus 왕초보를 위한 한 번에 끝내는 iOS 앱 개발 바이블
- Swift Playgrounds 앱 (iPad 또는 Mac에서 게임처럼 재미있게 코딩 학습)
- 추천 자료:
- 객체 지향 프로그래밍 (OOP) 이해:
- 클래스, 구조체, 프로토콜, 상속 등 객체 지향 프로그래밍의 주요 개념을 학습하고 Swift에서 어떻게 구현되는지 파악합니다.
- 데이터 구조 및 알고리즘:
- 배열, 딕셔너리, 세트 등 기본적인 데이터 구조와 함께 간단한 알고리즘 문제 해결 능력을 키웁니다.
2단계: SwiftUI로 UI 개발 시작하기 🖼️
현대적이고 선언적인 UI 프레임워크인 SwiftUI를 통해 사용자 인터페이스(UI) 개발을 시작합니다.
- SwiftUI 기본 개념 및 구성 요소 학습: View, Modifier, State, Binding, EnvironmentObject 등 SwiftUI의 핵심 개념을 이해하고, Text, Image, Button, List 등 기본적인 UI 구성 요소를 다루는 방법을 익힙니다.
- 추천 자료:
- Apple 공식 SwiftUI 튜토리얼 (Introducing SwiftUI)
- Hacking with Swift (SwiftUI by Example 등)
- 다양한 SwiftUI 온라인 강좌 및 유튜브 채널
- 추천 자료:
- 화면 구성 및 네비게이션:
- 여러 View를 조합하여 화면을 구성하고, NavigationView, TabView 등을 활용하여 앱 내 화면 전환을 구현합니다.
- 데이터 흐름 관리:
- @State, @Binding, @ObservedObject, @EnvironmentObject 등을 활용하여 데이터의 흐름을 효과적으로 관리하는 방법을 학습합니다.
- 간단한 앱 만들어보기:
- 학습한 내용을 바탕으로 투두 리스트, 계산기, 날씨 앱 등 간단한 앱을 직접 만들어보면서 SwiftUI에 대한 이해도를 높입니다.
3단계: iOS 앱 개발 심화 및 외부 기기 연동 📲↔️⚙️
SwiftUI와 함께 iOS 앱 개발에 필요한 다양한 프레임워크를 학습하고, 외부 기기 연동 방법을 익힙니다.
- iOS 프레임워크 학습:
- Foundation:
- 데이터 처리, 네트워킹, 파일 관리 등 기본적인 기능을 제공하는 프레임워크입니다.
- UIKit (필요시):
- SwiftUI와 함께 사용되거나, 기존 UIKit 기반 프로젝트를 이해하기 위해 기본적인 내용을 알아두면 좋습니다. (특히 SwiftUI에서 아직 지원하지 않는 고급 기능이나 특정 UI 커스터마이징에 필요할 수 있습니다.)
- Core Data / Realm:
- 앱 내 데이터를 영구적으로 저장하고 관리하기 위한 데이터베이스 기술입니다.
- Networking (URLSession):
- 서버와 통신하여 데이터를 주고받는 방법을 학습합니다. (JSON 데이터 파싱 포함)
- 외부 기기 연동 방법 학습:
- Core Bluetooth:
- 블루투스 LE (Low Energy) 기기와의 통신을 구현합니다. (센서, 웨어러블 기기 등)
- Central, Peripheral 역할 이해
- Service, Characteristic 검색 및 데이터 송수신
- ExternalAccessory Framework:
- MFi (Made for iPhone/iPad/iPod) 인증을 받은 유선 또는 무선 액세서리와 통신합니다.
- 기타 통신 방법:
- Wi-Fi (Network.framework), USB (상황에 따라 다름, 일반적으로는 ExternalAccessory 활용) 등 특정 기기 및 통신 방식에 맞는 프레임워크와 기술을 학습합니다.
- 주의사항:
- 외부 기기 연동은 해당 기기의 통신 프로토콜 및 API에 대한 이해가 필수적입니다. 제조사에서 제공하는 SDK나 문서를 참고해야 합니다.
- 비동기 처리 및 동시성 프로그래밍:
- async/await, Combine 프레임워크 등을 활용하여 네트워크 요청, 대용량 데이터 처리 등 시간이 오래 걸리는 작업을 효율적으로 처리하는 방법을 익힙니다.
- 앱 아키텍처 이해:
- MVC, MVVM 등 일반적인 모바일 앱 아키텍처 패턴을 학습하고, 프로젝트 규모에 맞는 구조를 설계하는 능력을 키웁니다.
빠르고 정확하게 배우기 위한 팁 💡
- 공식 문서 적극 활용:
- Apple 개발자 문서는 가장 정확하고 최신의 정보를 제공합니다. 영어에 익숙해지는 것이 중요합니다.
- 꾸준한 코딩 연습:
- 매일 꾸준히 코딩하는 습관을 들이고, 작은 기능이라도 직접 구현해보는 것이 중요합니다. "일단 만들어보자!" 정신이 중요합니다.
- 프로젝트 기반 학습:
- 만들고 싶은 앱을 정하고, 필요한 기능을 하나씩 구현해나가면서 학습하는 방식이 효과적입니다. 토이 프로젝트를 여러 개 진행해보세요.
- 오류 해결 능력 키우기:
- 개발 과정에서 마주치는 오류 메시지를 읽고 이해하며, 검색을 통해 스스로 해결하는 능력을 키워야 합니다. (Stack Overflow 등의 개발자 커뮤니티 활용)
- 코드 리뷰 및 피드백:
- 스터디 그룹이나 멘토를 통해 자신의 코드를 공유하고 피드백을 받는 것은 성장에 큰 도움이 됩니다.
- 개발자 커뮤니티 활동:
- 국내외 iOS 개발자 커뮤니티(예: 맥부기, iOS 개발자 그룹 등)에 참여하여 정보를 얻고 질문하며 동기 부여를 받으세요.
- 최신 기술 동향 파악:
- WWDC (Apple Worldwide Developers Conference) 영상이나 관련 기술 블로그를 통해 최신 기술 동향을 꾸준히 파악하는 것이 좋습니다.
이 로드맵은 일반적인 가이드이며, 개인의 학습 속도와 배경지식에 따라 조절될 수 있습니다. 무엇보다 중요한 것은 흥미를 잃지 않고 꾸준히 학습하는 것입니다. 즐겁게 개발 여정을 시작하시길 바랍니다! 😊
2017/05/01
iOS & Swift: Keyboard로 사용자 입력할 때, ToolBar 위로 이동하기
ViewController에서, 하단에 Toolbar가 있고, 사용자가 입력을 할 때, View를 위로 이동시켜서, 입력하는 내용이 화면에 표시되도록 하면, 어떤 내용을 입력하는지 알기 쉬운 UI가 됩니다.
ToolBar만 위로 이동해도 되지만, AutoLayout의 내용들을 다 무시하게 되므로, 전체 View를 Keyboard표시되는 것 만큼 위로 이동하게 만들어 봅니다.
Keyboard 이벤트 설명 블로그에서 이벤트 등록과 이벤트 발생 때, 실행되는 함수를 등록하는 방법을 이미 설명했습니다.
이제 표시될 때, ToolBar를 위로 올려주고, 입력이 끝나면 밑으로 내려줘야 합니다. 그리고, 입력 중에 화면이 회전되면, 적당하게 ToolBar의 위치를 옮겨줘야 합니다.
위로 얼마나 올려야 되는지는
키보드 표시될 때와, 사라질 때 함수 호출하기.
override func viewWillAppear(_ animated: Bool) {
//화면이 표시될때, Keyboard표시에 대한 이벤트가 발생하면 호출되는 함수를 등록한다.
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWillShow(_ notification:NSNotification) {
//키보드가 표시 될때, ToolBar의 위치를 올려준다.
moveToolbarUp(with: notification)
}
func keyboardWillHide(_ notification:NSNotification) {
//키보드가 사라질 때, ToolBar의 위치를 아래로 내려준다.
moveToolbarDown(with: notification)
}
Toolbar를 위로 올려주고, 아래로 내려주는 함수
fileprivate func moveToolbarUp(with notification:NSNotification) {
self.moveToolBar(isUp: true, with: notification)
}
fileprivate func moveToolbarDown(with notification:NSNotification) {
self.moveToolBar(isUp: false, with: notification)
}
fileprivate func moveToolBar(isUp up:Bool, with notification:NSNotification) {
if let userInfo = notification.userInfo {
//let beginFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
let animationOptions = UIViewAnimationOptions(rawValue: (userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).uintValue)
let frame = self.toolbar.frame
let rect:CGRect = CGRect(x: frame.origin.x,
y: frame.origin.y + endFrame.size.height * (up ? -1 : 1),
width: frame.size.width,
height: frame.size.height)
UIView.animate(withDuration: duration,
delay: 0.0,
options: animationOptions,
animations: { () -> Void in
self.toolbar.frame = rect
}, completion: nil)
}else{
//UserInfo가 없을 경우..
}
}
ToolBar가 올라가 있는 상태에서 화면을 옆으로 돌리면, 툴바의 위치가 이상하게 되어 버리는 예외를 처리하기 위해서, 화면이 회전할 때, 키보드를 사라지게 해줍니다. 더 좋은 방법이 있겠지만, 이정도로 마무리..
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
//화면이 옆으로 돌아갈 때, 호출되는 이벤트로, 이벤트 발생 시, 키보드를 아래로 내려주면 이동 후에 다시 선택하면 되도록 한다
self.inputTextField.resignFirstResponder();
}
2017/03/28
iOS & Swift : Keyboard가 표시될 때, 사라질 때 이벤트와 그 키보드의 위치를 알아보자
(링크 [iOS] Keyboard가 표시될 때, 사라질 때 이벤트와 그 키보드의 위치는?)
일반적인 UIViewController 내에서는 표시할 위치를 이동시켜야, 키보드에 덮히지 않고, 사용자에게 표시할 수 있습니다.
1. 키보드가 화면에 나타나거나, 사라지는 Event는 무엇이고, 어떻게 알아낼까?
키보드가 표시될 때 전달되는 이벤트는...- NSNotification.Name.UIKeyboardWillShow : 키보드가 표시되기 전에 호출
- NSNotification.Name.UIKeyboardDidShow : 키보드가 표시되고 난 후에 호출
- NSNotification.Name.UIKeyboardWillHide : 키보드를 숨기기 전에 호출
- NSNotification.Name.UIKeyboardDidHide : 키보드를 숨기고 난 후에 호출
- NSNotification.Name.UIKeyboardWillChangeFrame : 키보드 모양이 바뀌기 전 (iOS 5 이상)
- NSNotification.Name.UIKeyboardDidChangeFrame : 키보드 모양이 바뀐 후 (iOS 5 이상)
override func viewWillAppear(_ animated: Bool) {
//화면이 표시될때, Keyboard표시에 대한 이벤트가 발생하면 호출되는 함수를 등록한다.
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidHide(_:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}
화면이 사라질 때, 등록한 것을 삭제해야 한다. 물론 삭제하면 더 이상 이벤트가 발생해도 해당 함수를 호출하지 않습니다.
SourceCode
override func viewWillDisappear(_ animated: Bool) {
//화면이 사라질 때, keyboard 표시에 대한 이벤트를 받지 않도록, 등록을 삭제한다.
NotificationCenter.default.removeObserver(self)
}
이벤트가 발생할 때, 호출하는 함수들을 정의한다. 해당 이름은 뭐든지 관계없으나 인자로 받는 것은 명시를 해줘야 합니다.
SourceCode
//키보드가 표시 될 때 호출 되는 함수
func keyboardWillShow(_ notification:NSNotification) {
print(notification)
info(name: "Keyboard Will beShown", with: notification)
somethingDo(with: notification)
}
func keyboardDidShow(_ notification:NSNotification) {
info(name: "Keyboard Was Shown", with: notification)
}
//키보드가 사라질 때, 호출 되는 함수
func keyboardWillHide(_ notification:NSNotification) {
info(name: "Keyboard Will beHidden", with: notification)
somethingDo(with: notification)
}
func keyboardDidHide(_ notification:NSNotification) {
info(name: "Keyboard Was Hidden", with: notification)
}
그럼 다음으로 넘어가자.
2. 호출된 키보드 이벤트 함수에서 키보드의 크기를 알아야, 다른 컴포넌트의 위치를 조정할 수 있다.
userInfo를 가져와서 description을 출력해 보면 아래와 같습니다.
NSConcreteNotification 0x610000242460 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {375, 258}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {187.5, 796}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {187.5, 538}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 667}, {375, 258}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
위에서 표시되는 각 UserInfoKey에 대해서 조금 더 자세히 봅시다.
- UIKeyboardAnimationCurveUserInfoKey : 키보드가 표시될 때 Animation Curve
- UIKeyboardAnimationDurationUserInfoKey : 키보드 표시되는 시간
- UIKeyboardBoundsUserInfoKey : 키보드의 Bounds로 크기를 알 수 있는 bound
- UIKeyboardCenterBeginUserInfoKey : 키보드 표시되기 시작할 때의 중심 Point
- UIKeyboardCenterEndUserInfoKey : 키보드 표시된 후의 중심 Point
- UIKeyboardFrameBeginUserInfoKey : 키보드가 표시되기 시작할 때의 frame
- UIKeyboardFrameEndUserInfoKey : 키보드가 표시된 후의 Frame
- UIKeyboardIsLocalUserInfoKey : 지금 표시되는 키보드가 Current App에 속한 것인지 True/False로 가지고 있음. iPad의 경우 여러 App이 화면에 표시될 수 있는데, 다른 App이 표시하는 키보드인지 내가 표시한 키보드인지 구분할 수 있음. 이것이 False이면 반응하면 안됨. (iOS 9 이상에서 지원)
SourceCode
fileprivate func info(name str:String, with notification:NSNotification) {
if let userInfo = notification.userInfo {
let frameBegin = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect.zero
let frameEnd = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect.zero
let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber ?? NSNumber.init(value: 0)
let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber ).doubleValue
print("\(str) (\(Int(frameBegin.origin.x)),\(Int(frameBegin.origin.y)),\(Int(frameBegin.size.width)),\(Int(frameBegin.size.height))), (\(Int(frameEnd.origin.x)),\(Int(frameEnd.origin.y)),\(Int(frameEnd.size.width)),\(Int(frameEnd.size.height))) curve:\(curve), duration:\(duration)")
}
}
3. 결과로 나오는 값은 어떻게 될까요?
iPhone7
세로
Keyboard Will beShown (0,667,375,258), (0,409,375,258) curve:7, duration:0.25
Keyboard Was Shown (0,667,375,258), (0,409,375,258) curve:7, duration:0.25
Keyboard Will beHidden (0,409,375,258), (0,667,375,258) curve:7, duration:0.25
Keyboard Was Hidden (0,409,375,258), (0,667,375,258) curve:7, duration:0.25
가로
Keyboard Will beShown (0,375,667,194), (0,181,667,194) curve:7, duration:0.25
Keyboard Was Shown (0,375,667,194), (0,181,667,194) curve:7, duration:0.25
Keyboard Will beHidden (0,181,667,194), (0,375,667,194) curve:7, duration:0.25
Keyboard Was Hidden (0,181,667,194), (0,375,667,194) curve:7, duration:0.25
위 결과를 보시면, 표시되기 전에는 화면 아래 부분에 있다가 표시되면, 위로 올라오게 됩니다.
가로/세로 모드일때 따라서, 키보드의 위치와 크기가 달라집니다.
위 정보를 이용해서, UIViewController에서 ToolBar나 TextField가 키보드 아래에 있을 때, 키보드가 표시될 때 위로 이동시켜서 화면에 표시할 수 있고, 키보드가 사라질 때, 원래 위치로 이동할 수 있습니다.
2016/06/30
Swift에서 Singletons 구현하기. (Singletons in Swift)
Swift에서 Class를 싱글톤으로 구현하기 위해서는 접근자를 Private로 막아서 별도로 생성하지 못하도록 해야 합니다.
그리고, sharedInstance를 클래스 변수로 두어서, 이 변수를 통해서만 instance를 읽어 가도록 하면 되겠습니다.
final class SingletonObject {
static let sharedInstance = SingletonObject()
private init() {
}
}
이 클래스를 읽어서 쓸 경우는 아래 같이 가져오면 되겠습니다.
let theInstance = SingletonObject.sharedInstance
원본: http://www.thomashanning.com/singletons-in-swift/