1월 27일 목요일 / 4일 차
CH01
21. 익스텐션
22. 열거형
23. 옵셔널 체이닝
24. try-catch
25. 클로저
26. 고차함수
익스텐션
기존의 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가하는 기능
중요 내용 | 예시 코드 |
익스텐션이 타입에 추가할 수 있는 기능 - 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 - 타입 메서드 / 인스턴스 메서드 - 이니셜라이저 - 서브스크립트 - 중첩 타입 - 특정 프로토콜을 준수할 수 있도록 기능 추가 새로운 기능을 추가할 수는 있지만 기존에 존재하는 기능을 오버라이드 할 순 없다 |
extension SomeType { 추가기능 } |
extension Int { var isEven: Bool { return self % 2 == 0 } var isOdd: Bool { return self % 2 == 1 } } var number = 3 number.isOdd number.isEven |
☞ 익스텐션은 연산 프로퍼티를 추가할 수 있지만 저장 프로퍼티는 추가할 수 없다
☞ 타입에 정의되어있는 기존의 프로퍼티의 프로퍼티 감시자를 추가할 수 없다
열거형
연관성이 있는 값을 모아 놓은 것
중요 내용 | 예시 코드 |
- 특정 타입의 값을 원시값으로 가지게 하려면 열거형 이름 오른쪽에 타입을 명시해주면 된다 - 변수를 열거형 타입으로 지정해주면 컴파일러가 알아서 추론하여 열거형 이름 작성 생략가능 - 열거형은 switch와 사용하면 다양하게 활용할 수 있다 - 항목의 연관 값을 추가하려면 항목옆에 연관 값의 타입을 소괄호로 묶어주면 됨 - 열거형 인스턴스를 생성할때 매개 변수로 원시 값을 넘겨주면 원시 값을 가지고 열거형을 반환하게 할 수 있다 |
enum CompassPoint: String { case north = "북" case south = "남" case east = "동" case west = "서" } var direction = CompassPoint.east direction = .west |
옵셔널 체이닝
옵셔널에 속해 있는 nil 일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정
중요 내용 | 예시 코드 |
- 옵셔널에 값이 있다면 프로퍼티 메서드 등을 호출할 수 있고, 옵셔널이 nil 이라면 프로퍼티 메서드 등은 nil을 반환한다. - ? 로 옵셔널체이닝을 하면 접근한 프로퍼티의 값은 항상 옵셔널에 감싸져있다. - ! 로 옵셔널체이닝을 하면 옵셔널 프로퍼티를 강제 언래핑하여 접근하기 때문에 값이 옵셔널로 감싸져있지 않다 |
struct Developer { var name: String } struct Company { let name: String var developer: Developer? } var developer = Developer(name: "han") var company = Company(name: "gunter", developer: developer) print(company.developer) print(company.developer?.name) print(company.developer!.name) |
에러 처리
프로그램 내에서 에러가 발생한 상황에 대해 대응하고 이를 복구하는 과정
중요 내용 | 예시 코드 |
swift의 에러 처리 - 발생(throwing) - 감지(catching) - 전파(propagating) - 조작(manipulating) swift 오류를 처리하는 4가지 방법 - 함수에서 발생한 오류를 해당함수를 호출한 코드에 전파하는 방법 - do-catch구문을 이용해서 오류를 처리 - 옵셔널 값으로 오류를 처리 - 오류가 발생하지 않을 것이라고 확신하는 방법 |
do { try 오류 발생 가능코드 } catch 오류 패턴 { 처리 코드 } |
do { try checkPhoneBatteryStatus(batteryLevel: 20) } catch PhoneError.unknown { print("알 수 없는 에러입니다.") } catch PhoneError.batteryLow(let batteryLebel) { print("배터리 전원 부족 남은 배터리: \(batteryLebel)%") } catch { print("그 외 오류 발생 : \(error)") } |
☞ try? 를 사용하면 오류를 옵셔널 값으로 변환하여 처리 가능, 동작하던 코드가 오류를 던지면 코드의 반환 값은 nil이 된다.
☞ try! 는 try? 와 유사하지만 throwing 함수나 메서드가 에러를 던져주지 않을 거라고 확신할 때 사용하는 방법
클로저
코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있음
중요 내용 | 예시 코드 |
일급 객체란 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있다. 보통 클로저라 하면 이름없는 함수, 익명 함수를 지칭, 네임드,언네임드 둘 다 포함하지만 보통 언네임드 클로져를 말함 - Named closure - Unnamed closure - 클로져가 조금 길어지거나 가독성이 떨어지면 후행 클로져 기능을 사용하면 됨, 단 후행 클로져는 맨 마지막 매개변수로 전달되는 클로져에만 해당. - 매개변수로 클로져 여러개를 전달할 때는 맨 마지막 클로져만 후행 클로져를 사용 가능 |
{ (매개 변수) -> 리턴 타입 in 실행 구문 } |
let hello = { () -> () in print("hello") } hello() |
고차 함수
다른 함수를 전달 인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수
중요 내용 | 예시 코드 |
map | let numbers = [0,1,2,3] let mapArray = numbers.map { (number) -> Int in return number * 2 } print("map \(mapArray)") |
filter | let intArray = [10,5,20,13,4] let filterArray = intArray.filter { $0 > 5 } print("filter \(filterArray)") |
reduce | let someArray = [1,2,3,4,5] let reduceResult = someArray.reduce(0) { (result: Int, element: Int) -> Int in print("\(result) + \(element)") return result + element } print("reduce \(reduceResult)") |
복습할 내용
옵셔널 체이닝 사용 방법
에러 처리 try-catch 외의 내용
클로저 전부다
고차함수 전부다
오늘의 공부 후기
어느새 수강 4일 차에 접어들었습니다.
스위프트에서 가장 기본적인 문법만 요약해놓은 챕터 1을 공부하면서 어려운 점도 많았지만
다른 언어와 비교했을 때 스위프트 언어만의 특성을 제대로 알 수 있게 되었습니다.
실습에 앞서 복습할 내용들을 한번 더 수강하고 정리하여 기본적인 문법들을 완벽히 숙지하고 넘어가겠습니다.
5일 차는 본격적으로 앱 개발 실습을 진행할 예정입니다.
강의를 신청하면서 가장 기대했던 부분이기 때문에 최대한 열심히 해보겠습니다
챕터 1을 진행하면서 작성한 playground 파일들은 깃허브에 올려두었습니다.
https://github.com/cocobomi/iOS_App_Class
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.