[iOS] Extension

r1verfuture·2022년 4월 14일
0

iOS

목록 보기
21/30

Extension

  • 모든 타입 (구조체, 클래스, 열거형, 프로토콜, 제네릭 타입) 에 새로운 기능을 추가할 수 있는 기능
  • 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없어도 타입만 알고 있다면 그 타입의 기능을 확장할 수 있다.
  • 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없다.
  • 기존 타입에 기능을 추가하는 수평 확장 개념
  • 외부 라이브러리나 프레임워크를 가져다가 쓰는 경우에는 원본 소스에 직접 접근해서 내가 원하는 기능을 추가할 수 없는데 이때 extension 을 사용하면 내가 원하는 기능을 추가할 수 있다.
  • 따로 상속받지 않아도 된다.
  • 기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수 있다.
  • Swift 표준 라이브러리 타입의 기능 대부분은 extension 으로 구현되어 있다. (ex. 구조체 타입인 String 의 정의 부분을 보면 여러 extension 을 볼 수 있는데, extension 들 중에서 프로토콜을 채택한 부분들을 보면 'String' 구조체는 'TextOutputStream', 'TextOutputStreamable' 프로토콜 등을 채택하고 있는 것을 알 수 있다.)
  • 여러 기능을 여러 extension 블록으로 나눠서 구현해도 괜찮다. (일반적으로 관련된 기능별로 블록을 나눈다.)

선언

// MARK: [코드 1] 익스텐션 선언 기본 형태
extension 확장할 타입 이름 {
	// 확장할 타입에 추가될 새로운 기능 구현
}

프로토콜 채택

// MARK: [코드 2] 익스텐션 선언 형태 (프로토콜 채택 ver.)
extension 확장할 타입 이름 : 채택할 프로토콜 이름1, 채택할 프로토콜 이름2 {
	// 확장할 타입에 추가될 새로운 기능 구현
    // 프로토콜 요구사항 준수
}

연산 프로퍼티 추가

// MARK: [코드 3] Int 구조체에 연산 프로퍼티 추가해서 확장
extension Int {
	// 해당 정수값이 짝수인지 판별하는 변수
	var isEven : Bool {
    	return self % 2 == 0
    }
    
    // 해당 정수값이 홀수인지 판별하는 변수
    var isOdd : Bool {
    	return self % 2 == 1
    }
}

print(1.isEven) // false 라고 출력된다.
print(1.isOdd) // true 라고 출력된다.

메소드 추가

// MARK: [코드 4] Int 구조체에 메소드 추가해서 확장
extension Int {
	// 해당 정수값과 n 을 곱해서 반환해주는 함수
	func multiply(by n: Int) -> Int {
    	return self * n
    }
}

print(1.multiply(by: 2)) // 2 라고 출력된다.

참고

  • https://blog.yagom.net/529/ (마지막에 있는 '이니셜라이저 추가' 부분은 subscript 공부한 후에 다시 공부해서 추가하기)
profile
#iOS #Swift #Developer #Python

0개의 댓글

관련 채용 정보