코드 출처 - iOS 프로그래밍을 위한 스위프트 기초
- 클로저 closure
-
- 실행 가능한 코드의 블럭이자 1급 시민 (first-citizen)
- 변수, 상수 등으로의 저장 및 전달과 매개변수의 전달이 가능하고 반환값이 존재할 수 있음.
- 함수 → 클로저의 일종 (이름이 있는 클로저임)
- 정의
{ (매개변수 목록) -> 반환타입 in /* 실행할 코드 */ }
- 주로 함수의 전달인자로 많이 사용된다.
- 실행 가능한 코드들을 묶어 함수로 전달
- 예시
-
let add: (Int, Int) -> Int add = { (a: Int, b: Int) in return a + b } let substract: (Int, Int) -> Int substract = { (a: Int, b: Int) in return a - b } let divide: (Int, Int) -> Int divide = { (a: Int, b: Int) in return a / b } func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) { var calculated: Int calculated = calculate(a: 50, b: 10, method: substract) // 40 calculated = calculate(a: 50, b: 10, method: divide) // 5 // 함수를 호출할 때 클로저를 작성하여 전달할 수도 있음 calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in return left * right }) print(calculated) // 500
-
- 축약을 다양하게 할 수 있다.
- 후행클로저 - 클로저를 함수의 마지막 전달인자로 작성하는 것
- 반환타입 생략
- 당연한 경우 컴파일러도 알 수 있기 때문에 생략 가능하다.
- 단축인자 이름
- 클로저의 매개변수 이름 목록이 불필요한 경우 생략 가능하다.
- 임시적 반환 표현 - 어차피 마지막 줄은 'rutrn 반환값' 이기 때문에 return 키워드를 생략하는 것
- 예시
-
var result: Int // 축약 전 result = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in return left + right }) // 축약 후 result = calculate(a: 50, b: 10) { $0 + $1 } // $0: 0번째 인자, $1: 1번째 인자
-
- 웬만하면 다른 사람들이 알아볼 수 있을 정도로만 축약해야 한다.
- 읽어보기
- 실행 가능한 코드의 블럭이자 1급 시민 (first-citizen)
-
- 프로퍼티 property
- 구조체, 클래스, 열거형 등 타입과 연관된 값들을 표현할 때 사용
- 종류
- 저장 프로퍼티 stored property - 값들을 저장
- 연산 프로퍼티 computed property - 값들을 연산
- 역할
- 인스턴스 프로퍼티 instance property
- 타입 프로퍼티 type property
- 읽기전용 연산 프로퍼티 → 앞에 get 붙여주면 됨
- 읽기, 쓰기 모두 가능하게 하려면 set
- 매개변수 명을 명시하지 않으면 newValue가 들어온다.
- 코드
- 프로퍼티 감시자
- property observer
- 프로퍼티의 값이 변경될 때를 감시하고 있다가 원하는 동작을 수행할 수 있도록 도움
- 블럭 내에 넣어준다.
- willSet {}
- 바뀌기 직전 호출
- 암시적 매개변수 → newValue
- didSet {}
- 바뀐 직후 호출
- 암시적 매개변수 → oldValue
- willSet {}
- 프로퍼티 감시자와 연산 프로퍼티 기능을 동시에 사용할 수 없다.
- 프로퍼티 감시자는 저장된 값이 변경되면 호출되는 것이기 때문
- 지역, 전역 변수 모두에 사용이 가능하다.
- 코드
- 상속 inheritance
- 클래스, 프로토콜 등에서 가능함
- 열거형, 구조체에서는 x
- 다중 상속 불가 (단일 상속!)
- 정의
-
class 이름: 부모클래스명 { /* 구현부 */ }
-
- 앞에 static, final class 붙으면 재정의 할 수 없음
- 메서드를 새로 정의하려면 override를 붙여준다.
- 부모 클래스의 메서드를 호출하려면 self.메서드명
- 코드
- 클래스, 프로토콜 등에서 가능함
'개발 > iOS' 카테고리의 다른 글
swift 문법 기초 6/7 (0) | 2021.08.30 |
---|---|
틀린문제 (스위프트 클로저 퀴즈) (0) | 2021.08.29 |
[Swift] 함수형 타입 Functional Type (0) | 2021.08.28 |
swift 문법 기초 4/7 (0) | 2021.08.26 |
틀린 문제 (스위프트 함수 퀴즈) (0) | 2021.08.26 |
댓글