λ°˜μ‘ν˜•

iOS/Swift 46

[Swift] Copy on write(COW)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ Copy on write에 λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. Copy on writeμ΄λž€ Copy on writeλŠ” 데이터λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λ©΄μ„œ, 원본 데이터가 λ³€κ²½λ˜κΈ° μ „κΉŒμ§€λŠ” κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜λ‹€κ°€ 원본 데이터가 λ³€κ²½λ˜λŠ” μ‹œμ μ—μ„œ λ³΅μ‚¬ν•˜μ—¬ μžμ‹ λ§Œμ˜ 독립적인 데이터λ₯Ό κ°€μ§€κ²Œ λ˜λŠ” μ΅œμ ν™” 기법을 λ§ν•©λ‹ˆλ‹€. Swiftμ—μ„œλŠ” 기본적으둜 Array, Dictionary, Set λ“±μ˜ κ°’ νƒ€μž…μ—μ„œ Copy on writeλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, κ°’ νƒ€μž…μ„ λ‹€λ£° λ•ŒλŠ” Copy on write에 λŒ€ν•΄ 이해가 ν•„μš”ν•©λ‹ˆλ‹€. Copy on write의 λ™μž‘ 원리 var originArray = [1, 2, 3, 4] var copyArray = originArray // copyArrayλŠ” originArray..

iOS/Swift 2023.03.30

[Swift] μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ μ»¬λ ‰μ…˜ νƒ€μž…μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ»¬λ ‰μ…˜ νƒ€μž…μ€ 데이터λ₯Ό λͺ¨μœΌκ³ , μ €μž₯ν•˜κ³ , μ‚¬μš©ν•˜λŠ” 방법을 μ •μ˜ν•œ 좔상화 κ°œλ…μž…λ‹ˆλ‹€. Swift의 μ»¬λ ‰μ…˜ νƒ€μž…μ€ Array, Set, Dictionary둜 3가지가 μžˆμŠ΅λ‹ˆλ‹€. 1. μ»¬λ ‰μ…˜ νƒ€μž…μ˜ μ’…λ₯˜ (1) Array ArrayλŠ” 데이터가 μˆœμ„œλ₯Ό 가지고 μžˆλŠ” 리슀트 ν˜•νƒœμ˜ μ»¬λ ‰μ…˜ νƒ€μž…μž…λ‹ˆλ‹€. ArrayλŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터에 μ ‘κ·Όν•  수 있으며, μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” 배열을 μƒμ„±ν•˜κ³ , 값을 μΆ”κ°€ν•˜κ³ , 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 읽고 λ³€κ²½ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. // λ°°μ—΄ 생성 var numbers = [1, 2, 3, 4, 5] // 배열에 값을 μΆ”κ°€ numbers.append(6) // λ°°μ—΄ 인덱슀 μ‚¬μš©ν•˜μ—¬ κ°’ 읽기 let firstN..

iOS/Swift 2023.03.26

[Swift] Enum(μ—΄κ±°ν˜•)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ Enum(μ—΄κ±°ν˜•)에 λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. Enumμ΄λž€? Enum은 Enumeration(μ—΄κ±°ν˜•)의 μ€„μž„λ§λ‘œ, μ„œλ‘œ μ—°κ΄€λœ κ°’λ“€μ˜ 집합을 μ •μ˜ν•  수 μžˆλŠ” μžλ£Œν˜•μž…λ‹ˆλ‹€. Swiftμ—μ„œλŠ” μ—΄κ±°ν˜•μ΄ 일반적으둜 Int, String λ“±μ˜ μ›μ‹œκ°’(Raw Value) λ˜λŠ” μ—°κ΄€κ°’(Associated Value)을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성을 높이고, 정확성을 μœ μ§€ν•˜λ©΄μ„œ κ°„κ²°ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 Enum을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, μƒνƒœλ₯Ό λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³  이λ₯Ό 쑰건문 등을 톡해 λΉ„κ΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό 생각해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. let stateA = "State A" let stateB = "State B"..

iOS/Swift 2023.03.22

[Swift] μ˜΅μ…”λ„(Optional)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ μ˜΅μ…”λ„μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 1. μ˜΅μ…”λ„μ˜ κ°œλ… μ˜΅μ…”λ„μ€ μŠ€μœ„ν”„νŠΈμ—μ„œ 값이 μžˆμ„ μˆ˜λ„ 있고, 없을 μˆ˜λ„ μžˆλŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μž…λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ nil일 μˆ˜λ„ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 선언방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. var optionalInt: Int? // Int νƒ€μž…μ˜ μ˜΅μ…”λ„ λ³€μˆ˜ var optionalString: String? // String νƒ€μž…μ˜ μ˜΅μ…”λ„ λ³€μˆ˜ μœ„μ— μ˜ˆμ‹œμ²˜λŸΌ μ˜΅μ…”λ„ λ³€μˆ˜ μ„ μ–Έ μ‹œμ—λŠ” μžλ£Œν˜• 뒀에 λ¬ΌμŒν‘œλ₯Ό λΆ™μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€. 2. μ˜΅μ…”λ„ μ‚¬μš©λ°©λ²• μ•žμ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μ˜΅μ…”λ„μ€ 값이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ 있기 λ•Œλ¬Έμ— μ‚¬μš©ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ 값이 μ‘΄μž¬ν•˜λŠ”μ§€ ν•˜μ§€ μ•ŠλŠ”μ§€ 확인을 ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ•Œ, μ‚¬μš©ν•˜λŠ” 방법은 크게 4가지가 μžˆμŠ΅λ‹ˆλ‹€. (1)..

iOS/Swift 2023.03.17

[Swift] μ ‘κ·Όμ œμ–΄μž(Access Control)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ μ ‘κ·Όμ œμ–΄μžμ— λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€. μ ‘κ·Όμ œμ–΄μž μ•žμ„œ μ„€λͺ…ν•œ λͺ¨λ“ˆκ³Ό μ†ŒμŠ€νŒŒμΌλ“±μ˜ μš”μ†Œλ“€μ—μ„œ 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λ©° 객체지ν–₯의 νŠΉμ„± 쀑 ν•˜λ‚˜μΈ 은닉화λ₯Ό κ΅¬ν˜„ν•  수 있게 ν•΄ μ€λ‹ˆλ‹€. μ ‘κ·Όμ œμ–΄μžμ˜ μ’…λ₯˜ μ ‘κ·Όμ œμ–΄μžλŠ” 총 5가지λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 1. open open μ ‘κ·Ό μ œμ–΄μžλŠ” κ°€μž₯ 높은 μˆ˜μ€€μ˜ μ ‘κ·Ό μ œμ–΄μžλ‘œ, λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œλ„ ν•΄λ‹Ή ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μ„œλΈŒν΄λž˜μ‹±(subclassing)ν•˜κ±°λ‚˜ μ˜€λ²„λΌμ΄λ”©(overriding)ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 보톡 μ™ΈλΆ€ 라이브러리λ₯Ό λ§Œλ“€κ³  μ‚¬μš©ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. open으둜 μ„ μ–Έλœ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μƒμ†ν•˜κ±°λ‚˜ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. open class Animal { open func bark() { print("으λ₯΄λ  으λ₯΄λ ") ..

iOS/Swift 2023.03.15

[Swift] Closure에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ 기쑴에 μž‘μ„±ν–ˆλ˜ ν΄λ‘œμ € ν¬μŠ€νŒ…μ΄ μ’€ μ–΄μ„€ν”ˆ λŠλ‚Œμ΄ λ“€μ–΄ λ‹€μ‹œ ν•˜λ‚˜μ˜ ν¬μŠ€νŒ…μœΌλ‘œ 정리해보렀고 ν•©λ‹ˆλ‹€. Closureλž€? ClosureλŠ” Swiftμ—μ„œ 이름이 μ—†λŠ” 읡λͺ… ν•¨μˆ˜μž…λ‹ˆλ‹€. ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, μž…λ ₯값을 λ°›μ•„ 좜λ ₯값을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Swiftμ—μ„œλŠ” closureκ°€ 일급 객체둜 μ·¨κΈ‰λ˜μ–΄, λ³€μˆ˜λ‚˜ μƒμˆ˜μ— μ €μž₯ν•˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 인자둜 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ closureλŠ” 쀑첩될 수 있으며, 이λ₯Ό 톡해 더 λ³΅μž‘ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Closure의 ν‘œν˜„ 방법 Swiftμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ closureλ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. { (parameters) -> ReturnType in statements } 예λ₯Ό λ“€μ–΄, map λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ closure의 μ˜ˆμ‹œλ₯Ό ..

iOS/Swift 2023.03.13

[Swift] Generics에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ Generics에 λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€. Swiftμ—μ„œ Generics μ‚¬μš©ν•˜κΈ° GenericsλŠ” Swift의 κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ ν•¨μˆ˜, λ©”μ„œλ“œ, 클래슀, μ—΄κ±°ν˜• λ“±μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 특히, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ—μ„œ λ™μž‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Int λ°°μ—΄, String λ°°μ—΄ λ˜λŠ” λͺ¨λ“  νƒ€μž…μ˜ 배열을 λ‹€λ£¨λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό μΌλ°˜ν™”ν•˜μ—¬ λ°°μ—΄ λ‚΄λΆ€μ˜ λͺ¨λ“  값에 λŒ€ν•΄ λ™μž‘ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. Generics의 ꡬ문 GenericsλŠ” λ‹€μŒκ³Ό 같은 ꡬ문으둜 μž‘μ„±λ©λ‹ˆλ‹€. func functionName(parameter1: T, parameter2: T) { } TλŠ” μž„μ˜μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” 일반적인 μ΄λ¦„μž…λ‹ˆ..

iOS/Swift 2023.03.09

[Swift] ARC(Automatic Reference Counting)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ ARC에 λŒ€ν•΄μ„œ 정리해보렀고 ν•©λ‹ˆλ‹€. ARCκ°€ λ©”λͺ¨λ¦¬ μ˜μ—­ μ€‘μ—μ„œ Heap μ˜μ—­μ„ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄μ„œ λ¨Όμ € 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ˜μ—­ ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ, μ»΄ν“¨ν„°μ˜ λ©”λͺ¨λ¦¬λŠ” μ—¬λŸ¬ 개의 μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜μ–΄ μžˆλŠ”λ° 이 μ€‘μ—μ„œ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ μ˜μ—­μ€ stackκ³Ό heapμž…λ‹ˆλ‹€. Stack - Stack은 ν•¨μˆ˜ 호좜과 κ΄€λ ¨λœ 정보λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μž…λ‹ˆλ‹€. ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€, ν•΄λ‹Ή ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜, 그리고 ν•¨μˆ˜μ˜ λ°˜ν™˜ μ£Όμ†Œ 등이 μŠ€νƒμ— μ €μž₯λ©λ‹ˆλ‹€. ν•¨μˆ˜μ˜ 싀행이 λλ‚˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ—μ„œ μ‚¬μš©λœ λ©”λͺ¨λ¦¬λŠ” μŠ€νƒμ—μ„œ μ œκ±°λ©λ‹ˆλ‹€. Heap - Heap은 ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μž…λ‹ˆλ‹€. κ°œλ°œμžκ°€ ν•„μš”μ— 따라 λ©”λͺ¨λ¦¬..

iOS/Swift 2023.03.04

[Swift] GCD(Grand Central Dispatch)에 λŒ€ν•΄μ„œ

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ GCD에 λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. GCD의 κ°œλ…κ³Ό μ‚¬μš©λ²•, 그리고 μ˜ˆμ‹œλ₯Ό μ€‘μ‹¬μœΌλ‘œ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€. GCD의 κ°œλ… - GCD (Grand Central Dispatch)λŠ” C기반의 μ €μˆ˜μ€€ API둜 Apple의 닀쀑 μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ κΈ°μˆ μž…λ‹ˆλ‹€. GCDλŠ” λΉ„λ™κΈ°μ μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” 큐(Queue)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이 νλŠ” λ°”λ‘œ 저희가 μ•Œκ³  μžˆλŠ” DispatchQueueμž…λ‹ˆλ‹€. 이 νλŠ” 각각의 μž‘μ—…μ€ λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μˆ˜ν–‰λ˜λ©° μ•„λž˜μ™€ 같이 두 가지 μ’…λ₯˜λ‘œ λ‚˜λ‰©λ‹ˆλ‹€. (1) Serial Queue - 큐에 μΆ”κ°€λœ μž‘μ—…μ€ ν•œ λ²ˆμ— ν•˜λ‚˜μ”© 순차적으둜 μ‹€ν–‰λ©λ‹ˆλ‹€. λ‹€μŒ μž‘μ—…μ€ 이전 μž‘μ—…μ΄ λλ‚˜μ•Ό μ‹€ν–‰λ©λ‹ˆλ‹€. - main queue : UI μ—…λ°μ΄νŠΈμ™€ 같은 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•΄..

iOS/Swift 2023.03.01

[Swift] μ •κ·œμ‹μ„ ν†΅ν•œ λ¬Έμžμ—΄ νŒλ‹¨

μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ μ •κ·œμ‹μ„ 톡해 λ¬Έμžμ—΄μ„ νŒλ‹¨ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€ : ) 첫 번째, λ¬Έμžμ—΄ 전체가 νŠΉμ • κ·œμΉ™μ— λΆ€ν•©ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 방법 let myString: [String] = ["λ‚˜λŠ”", "바보닀", "1597", "κ°€λ‚˜λ‹€123λΌλ§ˆλ°”4"] let pattern: String = "^[0-9]*$" // 숫자 μ •κ·œμ‹ for string in myString { guard let _ = string.range(of: pattern, options: .regularExpression) else { print("\(string)은 숫자둜만 이루어지지 μ•Šμ•˜μ–΄μš”..") continue } print("\(string)은 숫자둜만 이루어져 μžˆλ„€μš”!") } myStringμ—μ„œ 숫자둜만 이루어진 ..

iOS/Swift 2022.11.14
λ°˜μ‘ν˜•