Extension

권현석·2023년 1월 4일
0

Extension은 class, structure, protocol 등의 이미 만들어진 data type에 추가적인 functionality를 만드는 것이다.

defining extension

extension SomeType {
	//Add new functionality
}
  • 여기서 SomeType은 class, struct, protocol 어느 것도 될 수 있다.

위의 코드는 Double을 소수점 3자리 까지 자르고 싶은 경우이다.

myDouble에 1000을 곱하고 소수점 아래자리를 자르고 1000을 나누어 3.141 을 표현 할 수 있다.
(round 메서드는 소수점 아래자리를 다 자르기 때문이다.)

그래서 extension을 통해 원하는 소수점 자리 수 만큼 자를 수 있는 메서드 round(to places: )를 만든다.

  • pow(밑, 지수)는 제곱근 함수이고, 지수인 places에 'Double'을 붙인 이유는 'presionNumber'의 data type이 double이기 때문이다.
  • var n = self는 myDouble을 의미한다.
    =>코드의 최하단에 myDouble.roudn(to: )에 의해 표현하고 싶은 만큼의 소수점자리 까지 표현 가능한 메서드가 작동함을 알 수 있다.

위의 경우는 오픈소스인 Double에 메서드를 추가한 것이다. 오픈소스가 아닌 data type에 메서드를 추가하는 경우를 알아보자

UIButton은 오픈소스가 아닌 데이터타입이다.
사각형의 버튼을 동그랗게 만들기 위해서는 위와 같은 과정이 필요하다.
버튼을 동그랗게 만드는 메서드를 만들어보자.

위의 코드와 같이 extension을 통해 메서드를 작동하고자 하는 메서드 상단에 만들어 주고 이 메서드를 호출하면 추가적으로 만든 메서드가 작동한다.

Protocol에서 extension을 하는 방법에 대해 알아보자

protocol CanFly {
	func fly()
}

extension CanFly {
	func fly() {
    	print("The object can takes off into the air")
    }
}

class Bird {

}

위의 코드와 같이 protocol을 정의하고 바로 아래에 이를 extension하면 class의 inheritance와 같은 특성처럼 CanFly protocol을 adopt한 class, structure는 추가적인 코드 작성없이 protocol CanFly의 기능을 한다.

어떤 Class, Structure에 delegate가 너무 많은 경우 그 Class, Structure를 extend해서 각각의 extension에 delegate를 adopt함으로써 코드를 짧게 만들 수 있다.

profile
wanna be an iOS developer

0개의 댓글