iOS

iOS (Swift) 예시로 쉽게 이해하는 Extension

crazydeer 2022. 6. 27. 15:38
반응형

 

여러가지 예시와 함께 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
}

 

Swift doc

 

새로운 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을 만들어보자

 

이때 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으 만든 함수가 나온다.

 

extension 사용하기

 

 

 

Class Extension

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

 

UIButton 클래스 버튼 round로 만들기 예시

 

위와 같은 방법으로 가로 세로 각각 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()

 

 

결과

클래스의 extension 결과

 

 

Protocol's extension

syntax

프로토콜의 extension

 

 

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

 

반응형