📚Swift 언어 기본 내용 복습2
📙Extension
- Extension이란?
- 클래스, 구조체, 열거형, 프로토토콜 타입에 새로운 기능 추가
- 기존에 있던 메서드 + 프로퍼티의 재정의는 불가능
- 저장 프로퍼티는 불가능 -> 연산 프로퍼티만 정의할 수 있음
- deinit은 정의 불가능 -> init의 경우 편의 이니셜라이저만 추가 가능
📙Data Type
- Optional 이란? -> 값이 있을수도 없을수도 있음을 나타내는 값으로 안전성 강조
- 사용하는 이유
- 변수나 상수에는 nil을 할당할 수 없음
- 값이 없을 수 있다는 것을 직관적으로 받아들일 수 있음
- 구현 방식
- 제네릭이 적용된 열거형 -> @frozen 키워드를 사용해 타입의 변경을 제한한다.
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
- Optional Data를 일반 타입으로 상용하려면?
- 옵셔널 바인딩을 사용하여 사용가능
- if let 구문 + guard let else {} 구문 사용가능
- 두가지의 차이점 = if let은 if 내부에서만 사용, guard let은 자유롭게 사용
- 강제 추출(!) 사용가능 nil인 경우에는 런타임 에러
- enum은 무엇인가?
- 열거형 -> C언어에서도 사용함
- 개발자가 정의한 항목 값 이외에는 추가하거나 수정이 불가능 하다
- .을 통해서 case에 접근 가능
- 코드 가독성 향상과 오타 감소 나도
- 원시값이나 연관값 사용하여 디테일 값 설정 가능
- 원시값 = enum 선언시 이름 옆에 원시값 타입 명시(Number, Char, String)
- type에 따라 자동 생성 될 수도, 모두 명시해야 하는 경우도 있다.(선언된 값에서 +1증가)(string은 case이름)
- enum.case.rawValue 통해 접근 가능
- 연관 값
- 상세한 정보 획득 가능(튜플의 형태) -> 모든 case가 가질 필요 없음
- 컬렉션 타입이란(Array, Dictionary Set)
- Array -> 같은 타입의 순서가 있는 타입(버퍼임)->필요에 따ㅏ라 크기 조절하며 삽입 삭제 자유롭다
- Dictionary -> key-value 형태의 컬렉션 타입 -> Key는 hashable 프로토콜 따름(중복불가)
- 스위프틍의 기본 데이터 타입은 모두 Hashable 프로토콜 채택
- Set -> 같은 타입의 데이터를 순서 없이 하나의 묶음으로 저장 -> 중복 불가능
- 순서가 중요하지 않고 중복없는 데이터 관리시 set이 유리( O(1)에 데이터 관리)
- Any, AnyObject
- Any는 모든 데이터 타입
- AnyObject는 클래스 인스턴스
- 매번 타입 확인과 변환이 필요하다 -> Swift에서 권장하지 않음
📙클로저
- Closure란?
- 어떤 기능을 하는 코드를 블록으로 모아둔 객체
- 참조 타입임
- 값 캡처
- 자신의 정의 위치에서 외부 값 캡쳐함
- 값의 타입과 관계없이 캡쳐시에 값을 참조한다(중요!!)
- 값은 모두 상수로 캡쳐됨으로 내부에서 값을 변경할 수 없다.(참조하지 않는 경우에)
강한 참조가 발생함으로 self를 사용하는 경우 weak self를 통해 순환참조를 예방해야한다.
- unowned로 캡쳐하는 경우에는 해당 인스턴스에 Nil할당된 후에도 클로저 작업 실행 상황엣4ㅓ 런타임 에러 발생
- Name Closure -> 이게 뭐지..?
- 함수랑 같은 것! -> 전역 함수는 어떠한 값도 캡쳐하지 않음 -> 중첩 함수는 자신을 포함하는 함수 값을 reference capture
- Trailing Closure, Escapaing Closure
- Trailing Closure = 함수 파라미터 마지막 요소가 클로저인 경우 소괄호 밖에서 클로저 선언 가능 -> 후행 클로저
- 여러개인 경우 다중 후행 클로저 사용 가능 -> {} 통해 표현
- Xcode에서 권장하는 방법임
- Escaping closure = 함수의 종료 이후 호출될 때 탈출 클로저 사용
- 함수 외부에서 클로저를 저장하거나 사용하는 경우
- 비동기 작업시 많이 사용한다.
- @escaping 키워드 사용
- 함수와 클로져의 차이점
- 함수가 결국 클로저의 형태 중 하나(named closure)
📙프로토콜
static func == (A : Class, B : Class) -> Bool {
return A.a == B.a
}
- Hashable 프로토콜
- 채택하는 타입은 모두 값을 정수 해시값으로 표현이 가능하다
- Equatable 프로토콜 준수함(해시값은 고유 값이어야 함으로 고유한지 확인하기 위해)
- 기본 타입은 모두 따르지만 custom의 경우 직접 채택해야함
- 클래스는 직접 hash함수를 구현해야함 -> Equatable 함수도 함께 구현해야함
- 열거형의 경우 연관값 없으면 자동으로 Hashable을 채택함