๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

iOS

(17)
[Combine] ๊ฐœ์š” ๋ฐ Publisher ์™€ Subscriber์˜ ๊ฐœ๋…, Combine์˜ ์žฅ์  Combine์„ ์•Œ๊ธฐ ์ „์—, Functional Reactive Programming์ด ์–ด๋–ค ๋งฅ๋ฝ์—์„œ ๋‚˜์™”๋Š”์ง€ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ Low Memory → Mass Production → Concurrency ์™€ ๊ฐ™์€ ๋งฅ๋ฝ์œผ๋กœ ๋ณ€ํ™”ํ•ด์™”๋Š”๋ฐ. ํ˜„์žฌ๋Š” Concurrency ๋‹จ๊ณ„๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— Side Effect๊ฐ€ ์žˆ์„ ์ˆ˜๋ฐ–์— ์—†์—ˆ๊ณ , ๊ทธ๋Ÿฌ๊ธฐ์— Pure Function์„ ์‚ฌ์šฉํ•˜๋Š” Functional ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  async ํ•œ ์ƒํ™ฉ์—์„œ asyncํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€? ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์œผ๋กœ stream ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜๋ ค๋ณด๋‚ด์ž๋Š” Reactive Programming์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.Comb..
VStack ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ View๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ด์œ  ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ๋‹คimport SwiftUIstruct ContentView: View { var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") } .padding() }}#Preview { ContentView()}import UIKitclass ViewController: UIViewController { override func viewDidLoad() { super.view..
ARC ์•Œ์•„๋ณด๊ธฐ ARC๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌiOS ์˜ ๊ฒฝ์šฐ ARC ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.ํž™์—์„œ๋Š” ์ฃผ๋กœ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ์˜ค๋žซ๋™์•ˆ ์ €์žฅ๋˜์–ด ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ํ• ๋‹น๋˜๋Š”๋ฐ, ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ์ฒด์™€ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‹ธ์ดํด์ด ๋ฐœ์ƒ์„ ํ•˜์—ฌ, ํž™์— ์˜ฌ๋ผ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด weak ์™€ unowned ์ด๋‹ค.๊ณตํ†ต์ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์„ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ฐจ์ด์ weak๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด nil ์„ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค.nil์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, var ๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฌด์กฐ๊ฑด optional ์ด์–ด์•ผ ํ•œ๋‹ค.unowned๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ ธ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ..
Struct / Class ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? Struct๊ตฌ์กฐ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ’ ํƒ€์ž…์ด๋‹ค. ๊ฐ’ ํƒ€์ž…(Value Type) ์€ ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณต์‚ฌ๋  ๋•Œ ์ธ์Šคํ„ด์Šค์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ณต์‚ฌ๋ณธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ’์˜ ์ €์žฅ์€ ์Šคํƒ์—์„œ ์ผ์–ด๋‚˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค. ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ let์œผ๋กœ ์„ ์–ธ ์‹œ ์ €์žฅ ์†์„ฑ์ด ์ „๋ถ€ ์ƒ์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค. ๋˜ ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์†์„ฑ ๋ณ€๊ฒฝ์ด ์›์น™์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ mutating ํ‚ค์›Œ๋“œ๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜๋‹ค. ์†Œ๋ฉธ์ž๋Š” ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.struct Student { var name: String var gender: String init(name: String, gender: Str..
Design Pattern in Swift [ ์ƒ์„ฑ ํŒจํ„ด ] 1) ๋นŒ๋” ํŒจํ„ด (Builder Pattern) - ์–ด๋–ค Product ์™€ ์ด๋ฅผ ๋งŒ๋“œ๋Š” Builder๋กœ ๊ตฌ์„ฑ - ์ด ํŒจํ„ด์€ Swift์— ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ์œ ํšจํ•œ ํŒจํ„ด์€ ์•„๋‹˜ -> ๋Œ€๋ถ€๋ถ„ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ - ํ”„๋กœํผํ‹ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉ struct MacBook { let color: String let memory: Int let storage: String let hasTouchBar: Bool } class MacBookBuilder { private var color = "Space Gray" private var memory = 16 private var storage = "256GB" private var hasTouchBar = fal..
22.07.21 ใ…ฃ ViewController Transition(ํ™”๋ฉด์ „ํ™˜) & Optional Binding(์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ) & ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ vs ํƒ€์ž… ํ”„๋กœํผํ‹ฐ ViewController Transition - Present - Dismiss (a.k.a Modal) Present - Dismiss ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ์ƒ์—์„œ๋Š” Modal ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ™”๋ฉด์ „ํ™˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์—์„œ ์œ„, ์œ„์—์„œ ์•„๋ž˜๋กœ ํ™”๋ฉด์ „ํ™˜์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ์˜ˆ์ธกํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๊ทธ ์ค‘์—์„œ Present๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค. ์šฐ์„  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ง€์ ์€ ์œ„ ์ฝ”๋“œ์—์„œ ์ฃผ์„์„ ๋‹จ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ์ž…๋‹ˆ๋‹ค. 2.5๋ฒˆ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์€ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜์ง€๋งŒ, ํ™”๋ฉด์ „ํ™˜์„ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” present ๋ฐฉ์‹์˜ style๋ฅผ fullscreen์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ „ํ™˜๋œ ํ™”๋ฉด์—”๋Š” ํ™”๋ฉด์„ ๋‹ซ์„ ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์ด ์—†์œผ๋ฏ€๋กœ bar ..
22.07.20 ใ…ฃ UICollectionViewController & Struct ๊ตฌ์กฐ์ฒด ํ™œ์šฉ UICollectionViewController UICollectionViewController ๋Š” ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ์”ฌ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Controller ์ž…๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜UICollectionViewController๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” UICollectionViewFlowLayout ์˜ ๊ฐœ๋…์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - itemSize layout.itemSize = CGSize(width: width/2, height: width/2) ์œ„์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ ์•„์ดํ…œ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. - minimumLineSpacing minimumLineSpacing ๋ž€ cell ์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค์–‘ํ•  ๋•Œ ์ตœ์†Œํ•œ ์ด ์ •๋„๋Š” ๋–จ์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. - minimumInteritemSp..
22.07.18 - 19 ใ…ฃ Enum CaseIterable & Table View Enum CaseIterable Enum์„ ํ™œ์šฉํ•ด ์—ด๊ฑฐํ˜• ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์ธ allCases๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ๋” ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Table View ๋‹ค์Œ์€ Table View Controller ์— ๊ผญ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  Table View ๋Š” Section / Row / Cell ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ๊ฐ์ด ๋ช‡ ๊ฐœ์˜ Section์ด๋‚˜ Row๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ Section ์•ˆ์— ๋ฐฐ์—ด ๋‚ด ์›์†Œ์˜ ๊ฐœ์ˆ˜๋งŒํผ Row๊ฐ€ ์žˆ๋Š” ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. - TableViewCell Reuse Mechanism (์žฌ์‚ฌ์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜) ์žฌ์‚ฌ์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ž€, Table Vi..