- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Optional
- MVC
- 명령어
- SWIFT
- r
- 시각화
- 연산자
- 오블완
- Linux
- ReLU
- 티스토리챌린지
- rest api
- SQL
- ios
- cocoapods
- decode
- tapply
- rxswift
- swiftUI
- scheduledTimer
- Python
- substr
- struct
- Observable
- Request
- HTTP
- barplot
- 딥러닝
- deeplearning
- sigmoid
iOS 개발 기록 블로그
iOS (Swift) 예시로 쉽게 이해하는 Extension 본문
여러가지 예시와 함께 Swift의 extension에 대해 알아보자.
지하철의 노선과 역이 계속 추가되는 것처럼
일반적으로 앱도 계속해서 기능들이 덧붙여져서 확장한다.
Extensions — The Swift Programming Language (Swift 5.7)
Extensions Extensions add new functionality to an existing class, structure, enumeration, or protocol type. This includes the ability to extend types for which you don’t have access to the original source code (known as retroactive modeling). Extensions
docs.swift.org
Extension Syntax
extension SomeType{ // new functionality to add to SomeType goes here } |

새로운 playground 파일을 하나 만든다.
import UIKit let myDouble = 3.141592 let myRoundedDouble= String(format: "%.1f", myDouble) print(myRoundedDouble) // 3.1 |
import UIKit var myDouble = 3.141592 myDouble.round() // 3 |
이렇게 해도 잘 나온다.
소수점 3자리까지만 나오게 하고 4번째 자리에서
반올림하려고 to: 3을 붙여주면 되게 만들어보자.

이때 extension을 써서 해결할 수 있다.
importUIKit extension Double { func round(to places: Int) { } } var myDouble = 3.141592 myDouble.round(to: 3) |
이렇게 extension 키워드를 써서
Double의 경우 round라는 함수를
to라는외부 파라미터 이름과 int를 써서
사용할 수 있도록 정의한 것이다.
이렇게만 해도 일단 에러는 사라지고
결과는 당연히 3.141592 그대로 나온다.
소수점 3자리까지 나오도록 반올림하려면
우선 1000 (10의 3제곱)을 곱해주고
그다음소수점 첫째자리를 반올림하여 3142를 만들고
다시 1000을 나눠줘서 원래 자릿 수를 맞춰주면 된다.

이를 extension 안에 적용해보자.

10의 places 만큼 제곱을 해준다.

8번째 줄 보면 let n = self를를 해줘서
n이라는 변수에 이 Double 본인 값을 넣어준다.
오른쪽에 결과 블록을 보면 3.141592가 들어가 있는 것을 확인할 수 있다.
import UIKit extension Double { func round(toplaces: Int) -> Double { let precisionNumber = pow(10, Double(places)) var n = self n = n * precisionNumber n.round() n = n / precisionNumber return n } } var myDouble = 3.141592 myDouble.round(to: 3) // 결과: 3.142 |
pow(10, Double(places))에서 더블로 묶어준 것은
precisionNumber가 Decimal이 돼버리기 때문에
Double로 만들어야 아래에서
n = n * precisionNumber를 해줄 수 있기 때문이다.
나머지는 똑같이 하고 -> Double 추가해주고
return n 해주면 위와 같이 결과가 제대로 나온다.
extension 사용하기
아무 Double 형 숫자를 만들어주고
만들었던 round 함수를 적어보면 아래와 같이
extension으로 만든 함수가 나온다.

Class Extension
UIButton 같은 이미 있는 Class에도 extension을 적용해보자.

위와 같은 방법으로 가로 세로 각각 50의 사각형 버튼을
절반인 25로 cornerRadius를 줘서 원형 버튼으로 만들 수 있다.
이걸 makeCircular라는 함수로 만들어보면 아래와 같다.
코드
import UIKit extension UIButton { func makeCircular() { self.clipsToBounds = true self.layer.cornerRadius = self.frame.size.width/ 2 } } let button= UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) button.backgroundColor = .red button.makeCircular() |
결과

Protocol's extension
syntax

Computed Properties' extension


위의 예시를 보면 모든 단위를 '미터'로 변환하여
Double로 갖고 있는 것이다.
이렇게 다양한 방법으로 extension을 사용할 수 있고
이를 통해 코드를 간결히 할 수 있다.
참고
안젤라유 강의
iOS & Swift - The Complete iOS App Development Bootcamp
From Beginner to iOS App Developer with Just One Course! Fully Updated with a Comprehensive Module Dedicated to SwiftUI!
www.udemy.com
Swift docs
Extensions — The Swift Programming Language (Swift 5.7)
Extensions Extensions add new functionality to an existing class, structure, enumeration, or protocol type. This includes the ability to extend types for which you don’t have access to the original source code (known as retroactive modeling). Extensions
docs.swift.org
'iOS' 카테고리의 다른 글
iOS (Swift) GPS 받고 위도, 경도 받아서 날씨 API 데이터 받기 (0) | 2022.06.29 |
---|---|
iOS (Swift) MARK: - 키워드와 Code Snippet 정의 및 사용법 (0) | 2022.06.28 |
iOS (Swift) Internal & External Parameter 란? (0) | 2022.06.26 |
iOS (Swift) 리펙토링(Refactoring)과 Computed Properties 이해하기 (0) | 2022.06.25 |
iOS (Swift) JSON 디코딩(Decoding) (0) | 2022.06.24 |