📚Swift 언어 기본 내용 복습3
📙키워드
- Mutating 키워드
- swift에서 구조체, 열거형 내부에서 변수 변경이 불가능함
- mutating 키워드가 붙는 경우 함수 내부에서 해당 구조체난 열거형의 값을 변경할 수 있음
- 단 let으로 선언된 Value Type은 Mutating 메서들르 사용하더라도 값을 변경할 수 없음
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
-
lazy 키워드
- 지연 저장 프로퍼티 -> 호출이 있어야만 값을 초기화 한다.
- init 이후에 값을 초기화 할 가능성 높음(상수가 되면 안된다.)
- 성능 저하나 공간 낭비를 줄일 수 있다.
- 문제점 : 다중 스레드 환경인 경우 변수를 여러 스레드가 동시 접근하는 경우 여러번 초기화 될 수 있다.
-
typealias 키워드
- 기존 타입에 새로운 이름을 지정할 때 사용 -> 코드의 가독성 증가
-
required 키워드
- 클래스나 프로토콜을 상속받는 클래스에서 반드시 구현되어야 하는 메서드
- 하위 클래스에서 구현되지 않으면 컴파일 오류가 발생한다
- Override 키워드와 함께 사용되는 경우 override 키워드가 반드시 함께 사용되어야함
📙패러다임
- map, filter, reduece의 구분과 개념
- swift = 함수를 객체로 취급한다. 따라서 함수를 매개 변수로 사용할 수있다.
- 매개 변수로 함수를 가지는 함수 = 고차함수(map, filter, reduece)
- map
- 초기값과 클로저를 전달 받아 전달받은 클로저 실행 후 그 결과 반환
- 기존 데이터를 변경하지 않고 새로운 값 반환
- 실질적으로 어떤 Data의 변경후 값을 사용할 때 자주 사용함
- filter
- 컨테이너 내부의 값을 걸러서 추출 -> 조건에 맞는 값을 모아준다.
- 특정 조건을 바탕으로 값을 걸러낼 때 사용한다.
- reduce
- 초기값을 하나의 값으로 합쳐줌 ex) 배열의 모든 값을 합치는 경우
- flatMap
- 컬랙션이나 비동기 시퀀스의 각 요소를 변환한 다음 하나의 배열로 평탄화
- 각 요소에 대해 변환 함수 적용 후 중첩 배열을 단일 배열로 병합
- compactmap
- 비동기 시퀀스 각 요소를 변환하고 변환 겨로가가 nil이 아닌 요소만을 포함한다.
📙function/method
📙프로퍼티
- 저장 프로퍼티와 연산 프로퍼티
- 저장 = 객체 내부의 값을 저장할 때 사용하는 기본적 프로퍼티
- 변수나 상수로 선언할 수 없음 -> 초기 값을 설정할 수 있다.
- 연산 프로퍼티 = 값을 저장하지 않고 인스턴스 내부, 외부 값을 연산
- 은닉화 된 값을 간접적으로 수정, 접근 가능
- getter, setter -> 코드 가독성이 나빠짐
- 연산 프로퍼티는 해당 역할을 동시에 하여 간편 + 직관적 코드 작성
- 쓰기 전용으로 구현할 수 없다
- 지연 저장 프로퍼티란?
- 해당 프로퍼티 호출시 값 초기화(lazy 키워드 사용)
- 성능 저하와 공간 낭비 줄일 수 있다.
- property wrapper에 대한 설명(swiftUI로 이해하는게 더 쉽다)
- 프로퍼티 래퍼는 여러 프로퍼티에 대해 반복되는 코드의 재사용
- 보일러 플레이트 코드 제거
- 최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태의 코드
- 반복되는 작업이나 패턴에 대한 일종의 표준화된 코드
- @propertyWrapper키워드를 사용해 구조체를 정의하고 내부에 프로퍼티에 대한 동작 정의
- 미리 정의한 동작을 재사용 할 수 있다.
- 클래스, 구조체, 열거형에서만 사용할 수 있다.
@propertyWrapper
struct Uppercase {
private var value : String = ""
var wrappedValue : String {
get { self.value}
set { self.value = newValue.uppercased() }
}
init(st initvalue : String) {
self.wrappedValue = initvalue
}
}
struct Address {
@Uppercase var town : String
}