πŸ‘©πŸ»‍πŸ’»/Swift 29

Swift의 μˆœν™˜ μ°Έμ‘° λ¬Έμ œμ— λŒ€ν•΄

μ˜ˆμ „μ— μžˆμ—ˆλ˜ λ©΄μ ‘μ—μ„œ μˆœν™˜ μ°Έμ‘°κ°€ 잘 μΌμ–΄λ‚˜λŠ” 상황에 λŒ€ν•΄ μ§ˆλ¬Έμ„ 받은 적이 μžˆλ‹€. κ·Έ λ•Œ λ‹¨μˆœνžˆ weak와 strong의 차이에 λŒ€ν•΄μ„œλ§Œ 쀄쀄이 μŠμ€ 기얡이 μžˆλŠ”λ°.. 정리λ₯Ό μ’€ ν•΄μ•Όκ² λ‹€ μ‹Άμ—ˆλ‹€. 클래슀 μΈμŠ€ν„΄μŠ€ μ‚¬μ΄μ˜ κ°•λ ₯ μˆœν™˜ μ°Έμ‘°(Strong Reference Cycle) : 두 클래슀 μΈμŠ€ν„΄μŠ€κ°€ μ„œλ‘œ κ°•λ ₯ μ°Έμ‘°λ₯Ό μ₯κ³  μžˆλ‹€λ©΄, 각 μΈμŠ€ν„΄μŠ€λŠ” μ„œλ‘œ μ‚΄κ²Œ μœ μ§€ν•œλ‹€. ex) class Person { let name: String init(name: String) { self.name = name } var apartment: Apartment? deinit { println("\(name) is being deinitialized") } } class Apartment { let number: I..

28. κ³ μ°¨ ν•¨μˆ˜ - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- κ³ μ°¨ ν•¨μˆ˜ κ³ μ°¨ ν•¨μˆ˜(Higher-order function)λŠ” 'λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ „λ‹¬μΈμžλ‘œ λ°›κ±°λ‚˜ ν•¨μˆ˜μ‹€ν–‰μ˜ κ²°κ³Όλ₯Ό ν•¨μˆ˜λ‘œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜'λ₯Ό λœ»ν•œλ‹€. μŠ€μœ„ν”„νŠΈμ˜ ν•¨μˆ˜(ν΄λ‘œμ €)λŠ” μΌκΈ‰μ‹œλ―Ό(일급객체)이기 λ•Œλ¬Έμ— ν•¨μˆ˜μ˜ μ „λ‹¬μΈμžλ‘œ 전달할 수 있으며, ν•¨μˆ˜μ˜ κ²°κ³Όκ°’μœΌλ‘œ λ°˜ν™˜ν•  수 μžˆλ‹€. 이번 νŒŒνŠΈμ—μ„œλŠ” μŠ€μœ„ν”„νŠΈ ν‘œμ€€λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” μœ μš©ν•œ κ³ μ°¨ν•¨μˆ˜[map, filter, reduce]에 λŒ€ν•΄ μ•Œμ•„λ³Έλ‹€. map, filter, reduce ν•¨μˆ˜λŠ” μŠ€μœ„ν”„νŠΈ ν‘œμ€€ 라이브러리의 μ»¨ν…Œμ΄λ„ˆ νƒ€μž…(Array, Set, Dictionary λ“±)에 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. - map mapν•¨μˆ˜λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ κΈ°μ‘΄ 데이터λ₯Ό λ³€ν˜•(transform)ν•˜μ—¬ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•œλ‹€. - filter filterν•¨μˆ˜λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€..

27. 였λ₯˜ 처리 - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- 였λ₯˜ 처리 μŠ€μœ„ν”„νŠΈμ—μ„œ 였λ₯˜(Error)λŠ” ErrorλΌλŠ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” νƒ€μž…μ˜ 값을 톡해 ν‘œν˜„λœλ‹€. Error ν”„λ‘œν† μ½œμ€ 사싀상 μš”κ΅¬μ‚¬ν•­μ΄ μ—†λŠ” 빈 ν”„λ‘œν† μ½œμΌ λΏμ΄μ§€λ§Œ, 였λ₯˜λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ νƒ€μž…(주둜 μ—΄κ±°ν˜•)은 이 ν”„λ‘œν† μ½œμ„ μ±„νƒν•œλ‹€. μŠ€μœ„ν”„νŠΈμ˜ μ—΄κ±°ν˜•μ€ 였λ₯˜μ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄κΈ°μ— μ•„μ£Ό μ ν•©ν•œ κΈ°λŠ₯이닀. μ—°κ΄€ 값을 톡해 였λ₯˜μ— κ΄€ν•œ λΆ€κ°€ 정보λ₯Ό μ œκ³΅ν•  μˆ˜λ„ μžˆλ‹€. 이번 μ˜ˆμ œμ—λŠ” ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 자판기λ₯Ό μž‘λ™μ‹œν‚€λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μƒν™©μ„ κ΅¬ν˜„ν•΄ λ³΄μ•˜λ‹€. - 였λ₯˜ ν‘œν˜„ Error ν”„λ‘œν† μ½œκ³Ό (주둜)μ—΄κ±°ν˜•μ„ ν†΅ν•΄μ„œ 였λ₯˜λ₯Ό ν‘œν˜„ν•œλ‹€. 자판기 λ™μž‘ 였λ₯˜μ˜ μ’…λ₯˜λ₯Ό ν‘œν˜„ν•œ VendingMachineError μ—΄κ±°ν˜• - ν•¨μˆ˜μ—μ„œ λ°œμƒν•œ 였λ₯˜ λ˜μ§€κΈ° 자판기 λ™μž‘ 도쀑 λ°œμƒν•œ 였λ₯˜λ₯Ό λ˜μ§€λŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄λ³Έ..

26. μ΅μŠ€ν…μ…˜ - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- μ΅μŠ€ν…μ…˜ μ΅μŠ€ν…μ…˜(Extension) 은 μŠ€μœ„ν”„νŠΈμ˜ κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜μ΄λ‹€. μ΅μŠ€ν…μ…˜μ€ ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•, ν”„λ‘œν† μ½œ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  수 μžˆλŠ” κΈ°λŠ₯이닀. κΈ°λŠ₯을 μΆ”κ°€ν•˜λ €λŠ” νƒ€μž…μ˜ κ΅¬ν˜„λœ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ•Œμ§€ λͺ»ν•˜κ±°λ‚˜ λ³Ό 수 μ—†λ‹€ 해도, νƒ€μž…λ§Œ μ•Œκ³  μžˆλ‹€λ©΄ κ·Έ νƒ€μž…μ˜ κΈ°λŠ₯을 ν™•μž₯ν•  μˆ˜λ„ μžˆλ‹€. μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° / μ—°μ‚° μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° νƒ€μž… λ©”μ„œλ“œ / μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ΄λ‹ˆμ…œλΌμ΄μ € μ„œλΈŒμŠ€ν¬λ¦½νŠΈ 쀑첩 νƒ€μž… νŠΉμ • ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•  수 μžˆλ„λ‘ κΈ°λŠ₯ μΆ”κ°€ ** μ΅μŠ€ν…μ…˜μ€ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, 기쑴에 μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯을 μž¬μ •μ˜ν•  μˆ˜λŠ” μ—†λ‹€. 이 λ‘˜μ€ λΉ„μŠ·ν•΄λ³΄μ΄μ§€λ§Œ μ‹€μ œ 성격은 많이 λ‹€λ₯΄λ‹€. 클래슀의 상속은 클래슀 νƒ€μž…μ—μ„œλ§Œ κ°€λŠ₯ν•˜μ§€λ§Œ μ΅μŠ€ν…μ…˜μ€ ꡬ쑰체, 클래슀, ν”„λ‘œν† μ½œ λ“±..

25. ν”„λ‘œν† μ½œ - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- ν”„λ‘œν† μ½œ ν”„λ‘œν† μ½œ(Protocol) 은 νŠΉμ • 역할을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ, ν”„λ‘œνΌν‹°, 기타 μš”κ΅¬μ‚¬ν•­ λ“±μ˜ 청사진을 μ •μ˜ν•œλ‹€. ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•μ€ ν”„λ‘œν† μ½œμ„ 채택(Adopted) ν•΄μ„œ νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μ‹€μ œλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ–΄λ–€ ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ λ”°λ₯΄λŠ” νƒ€μž…μ€ κ·Έ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€(Conform) κ³  ν‘œν˜„ν•œλ‹€. νƒ€μž…μ—μ„œ ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±μ‹œν‚€λ €λ©΄ ν”„λ‘œν† μ½œμ΄ μ œμ‹œν•˜λŠ” μ²­μ‚¬μ§„μ˜ κΈ°λŠ₯을 λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 즉, ν”„λ‘œν† μ½œμ€ κΈ°λŠ₯을 μ •μ˜ν•˜κ³  μ œμ‹œ ν•  뿐이지 슀슀둜 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. - μ •μ˜ protocol ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•œλ‹€. protocol ν”„λ‘œν† μ½œ 이름 { /* μ •μ˜λΆ€ */ ]} - κ΅¬ν˜„ ν”„λ‘œνΌν‹° μš”κ΅¬λŠ” 항상 var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ..

24. assert / guard - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μž‘ 도쀑에 μƒμ„±ν•˜λŠ” λ‹€μ–‘ν•œ μ—°μ‚° 결과값을 λ™μ μœΌλ‘œ ν™•μΈν•˜κ³  μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν™•μΈν•˜κ³  λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€. - Assertion assert(_:_:file:line:) ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. assert ν•¨μˆ˜λŠ” 디버깅 λͺ¨λ“œμ—μ„œλ§Œ λ™μž‘ν•œλ‹€. λ°°ν¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ œμ™Έλœλ‹€. μ˜ˆμƒν–ˆλ˜ 쑰건의 검증을 μœ„ν•˜μ—¬ μ‚¬μš©ν•œλ‹€. * assert(_:_:file:line:)와 같은 역할을 ν•˜μ§€λ§Œ μ‹€μ œ 배포 ν™˜κ²½μ—μ„œλ„ λ™μž‘ν•˜λŠ” precondition(_:_:file:line:) ν•¨μˆ˜λ„ μžˆλ‹€. - guard(λΉ λ₯Έμ’…λ£Œ- Early Exit) guardλ₯Ό μ‚¬μš©ν•˜μ—¬ 잘λͺ»λœ κ°’μ˜ 전달 μ‹œ νŠΉμ • 싀행ꡬ문을 λΉ λ₯΄κ²Œ μ’…λ£Œν•œλ‹€. 디버깅 λͺ¨λ“œ 뿐만 μ•„λ‹ˆλΌ μ–΄λ–€ μ‘°κ±΄μ—μ„œλ„ λ™μž‘ν•œλ‹€. guard의 else λΈ”λŸ­ λ‚΄λΆ€..

23. νƒ€μž… μΊμŠ€νŒ… - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- μŠ€μœ„ν”„νŠΈ νƒ€μž… μΊμŠ€νŒ… μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ 확인 ν•˜λŠ” μš©λ„ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λΆ€λͺ¨ ν˜Ήμ€ μžμ‹ 클래슀의 νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ”μ§€ 확인 ν•˜λŠ” μš©λ„ is, asλ₯Ό μ‚¬μš©ν•œλ‹€. * ν˜•λ³€ν™˜μ€ 'ex. let someDouble = Double(2)' νƒ€μž… μΊμŠ€νŒ…μ΄ μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ 값을 μƒμ„±ν•˜λŠ” 것이닀. - 예제 클래슀 - νƒ€μž…ν™•μΈ isλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ ν™•μΈν•œλ‹€. - μ—… μΊμŠ€νŒ…(Up Casting) asλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ»΄νŒŒμΌλŸ¬μ—κ²Œ νƒ€μž…μ •λ³΄λ₯Ό μ „ν™˜ν•΄μ€€λ‹€. Any ν˜Ήμ€ AnyObjectλ‘œλ„ νƒ€μž…μ •λ³΄λ₯Ό λ³€ν™˜ν•  수 μžˆλ‹€. μ•”μ‹œμ μœΌλ‘œ μ²˜λ¦¬λ˜λ―€λ‘œ κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ μƒλž΅ν•΄λ„ λ¬΄λ°©ν•˜λ‹€. - λ‹€μš΄ μΊμŠ€νŒ…(Down Casting) as? λ˜λŠ” as!λ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ..

22. μ˜΅μ…”λ„ 체이닝과 nil 병합 - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- μ˜΅μ…”λ„ 체이닝 μ˜΅μ…”λ„ 체이닝은 μ˜΅μ…”λ„μ˜ λ‚΄λΆ€μ˜ λ‚΄λΆ€μ˜ λ‚΄λΆ€λ‘œ μ˜΅μ…”λ„μ΄ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ μœ μš©ν•˜κ²Œ ν™œμš©ν•  수 μžˆλ‹€. 맀번 nil 확인을 ν•˜μ§€ μ•Šκ³  μ΅œμ’…μ μœΌλ‘œ μ›ν•˜λŠ” 값이 μžˆλŠ”μ§€ μ—†λŠ”μ§€ 확인할 수 μžˆλ‹€. - nil 병합 μ—°μ‚°μž μ€‘μœ„ μ—°μ‚°μžμ΄λ‹€. ?? Optional ?? Value μ˜΅μ…”λ„ 값이 nil일 경우, 우츑의 값을 λ°˜ν™˜ν•œλ‹€. 띄어쓰기에 μ£Όμ˜ν•˜μ—¬μ•Ό ν•œλ‹€.

21. μΈμŠ€ν„΄μŠ€ 생성 / μ†Œλ©Έ (init / deinit) - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ†Œλ©Έλ  λ•Œ ν˜ΈμΆœλ˜λŠ” λ””μ΄λ‹ˆμ…œλΌμ΄μ €, 그리고 이와 κ΄€λ ¨λœ 것듀에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² λ‹€. ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’ μ΄λ‹ˆμ…œλΌμ΄μ € init λ””μ΄λ‹ˆμ…œλΌμ΄μ € deinit - ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’ μŠ€μœ„ν”„νŠΈμ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λŠ” μ΄ˆκΈ°ν™”μ™€ λ™μ‹œμ— λͺ¨λ“  ν”„λ‘œνΌν‹°μ— μœ νš¨ν•œ 값이 ν• λ‹Ήλ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. ν”„λ‘œνΌν‹°μ— 미리 기본값을 할당해두면 μΈμŠ€ν„΄μŠ€κ°€ 생성됨과 λ™μ‹œμ— μ΄ˆκΈ°κ°’μ„ μ§€λ‹ˆκ²Œ λœλ‹€. 1. μ΄λ‹ˆμ…œλΌμ΄μ €(initializer) ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•˜κΈ° μ–΄λ €μš΄ κ²½μš°μ—λŠ” μ΄λ‹ˆμ…œλΌμ΄μ € init을 톡해 μΈμŠ€ν„΄μŠ€κ°€ κ°€μ Έμ•Ό ν•  μ΄ˆκΈ°κ°’μ„ 전달할 수 μžˆλ‹€. ν”„λ‘œνΌν‹°μ˜ μ΄ˆκΈ°κ°’μ΄ κΌ­ ν•„μš” 없을 λ•Œ μ˜΅μ…”λ„μ„ μ‚¬μš©! class λ‚΄λΆ€μ˜ init을 μ‚¬μš©ν• λ•ŒλŠ” convenience ν‚€μ›Œλ“œ μ‚¬μš© μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„μ€ 인슀..

20. 상속 - iOS ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ μŠ€μœ„ν”„νŠΈ 기초

- μŠ€μœ„ν”„νŠΈ 상속 상속은 클래슀, ν”„λ‘œν† μ½œ λ“±μ—μ„œ κ°€λŠ₯ν•˜λ‹€. μ—΄κ±°ν˜•, κ΅¬μ‘°μ²΄λŠ” 상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. μŠ€μœ„ν”„νŠΈμ˜ ν΄λž˜μŠ€λŠ” λ‹¨μΌμƒμ†μœΌλ‘œ, 닀쀑상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. 이번 νŒŒνŠΈμ—μ„œλŠ” 클래슀의 상속에 λŒ€ν•΄μ„œ μ•Œμ•„λ³Έλ‹€. - 문법 class 이름: 상속받을 클래슀 이름 { /* κ΅¬ν˜„λΆ€ */ } - μ‚¬μš© final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μž¬μ •μ˜(override)λ₯Ό 방지할 수 μžˆλ‹€. static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ νƒ€μž… λ©”μ„œλ“œλ₯Ό λ§Œλ“€λ©΄ μž¬μ •μ˜κ°€ λΆˆκ°€λŠ₯ ν•˜λ‹€. class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ νƒ€μž… λ©”μ„œλ“œλ₯Ό λ§Œλ“€λ©΄ μž¬μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€. class μ•žμ— final을 뢙이면 static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œκ²ƒκ³Ό λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€. override ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ ν•  수 μžˆλ‹€.