본문 바로가기
공부/[iOS&Swift]

[Swift] Extension(확장)에 대하여

by 인생은아름다워 2022. 1. 17.

✏️ Extension❓

Swift의 Extension이란 이미 존재하는 class, structure, enumeration, protocol 타입에 새로운 기능을 추가하는 기능이다. Objective-C의 카테고리와 비슷하다는데...

Swift의 Extension(확장)은 아래의 기능을 수행할 수 있다.

 

  • Add computed instance properties and computed type properties (연산 인스턴스 프로퍼티 / 연산 타입 프로퍼티)
  • Define instance methods and type methods (인스턴스 메서드 / 타입 메서드)
  • Provide new initializers (새로운 생성자)
  • Define subscripts (서브스크립트)
  • Define and use new nested types (중첩 타입)
  • Make an existing type conform to a protocol (어떤 프로토콜을 준수하도록 기능 추가)

✏️ Extension Syntax

extension SomeType {
	// new functionality
}

extension AnotherType: SomeProtocol, AnotherProtocol {
	// new functionality
}

위와 같이 구현할 수 있으며, AnotherType 의 경우 extension을 통해 SomeProtocol과 AnotherProtocol 프로토콜을 채택하도록 만들어주고있다.

 

확인해 볼 수 있는 것은, Extension에는 특별히 이름이 없다. 위의 예시에서는 SomeType이라는 이름의 Extension인 것이 아니라 SomeType을 확장시키고 있음을 참고하면 될 듯 하다.

Extension은 프로토콜, 제네릭 등의 기능을 확장시킬 수도 있으며, Where를 이용하여 제네릭 타입에 조건부로 기능을 추가할 수도 있다.

Extension을 통해 기능이 확장된 어떤 타입의 기능이 확장되었을 때, Extension이 정의되기 이전에 생성된 인스턴스들 또한 기능이 확장된다!

✏️ Computed Properties

extension Int {
	var doubledValue: Int {
		return self * 2
	}
	var trippledValue: Int {
		return self * 3
	}
}

print(10.doubledValue) // 20
print(11.trippledValue) // 30

위와 같이 사용가능하다, 하지만 저장프로퍼티와 기존프로퍼티에 Property observer(willset, didset)를 추가할 수는 없다!

✏️ Methods

extension Int {
	func multiply(by: Int) -> Int {
		return self * by
	}

	mutating multiplySelf(by n: Int) {
		self = self * 10 // self = self.multiply(by: n) 이렇게도 가능할 듯
	}
	
	static func isIntInstance(_ instance: Any) -> Bool {
		return instance is Int
	}
}

var intNum = 10
print(10.multiply(by: 10)) // 100
print(intNum.multiplySelf(by: 10) // 100
Int.isIntInstance(intNum) // true
Int.isIntInstance("10") // false

이런 식으로 어떤 타입에 인스턴스 매서드 또는 타입 매서드를 추가할 수 있다. 매우 강력한 기능인 것 같다.

Int는 struct로 구현되어있기에(Swift의 타입은 모두 Struct) 값을 바꾸고자한다면 mutating키워드를 생략하면 안된다!

이런식으로 생성자, 서브스크립트, 중첩 타입 등을 Extension을 통해서 구현해줄 수 있다.

예시를 들진 않지만, 스위프트로 개발을 하다보면 사용할 일이 많을 것이므로, 필요할 때 마다 공식문서를 꼭 참고해 보기로 하자.

✏️ Initializer(생성자) 내용 추가

Extension을 통해 생성자를 추가로 정의해줄 수 있다. 이는 타입을 정의할 때 만들지 않았더라도, 추가적으로 유연하게 데이터를 입력받아서 인스턴스를 생성할 수 있기에 편리한 기능이 될 수 있다.

다만 class 타입에 대해 Initializer를 추가로 구현해줄 때 편의 생성자( Convenience) 는 추가할 수 있지만, 지정 생성자(Designated)는 반드시 클래스 타입에서 직접 구현해줘야 한다.

댓글