[Swift] extension

HongDuHyeon·2023년 4월 2일
0
post-thumbnail

extension 이란?

기존의 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가하는 기능

extension이 타입에 추가할 수 있는 기능은 다음과 같다 !

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 매서드 / 인스턴스 매서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩타입
  • 특정 프로토콜을 준수할 수 있도록 기능추가

참고로 extension타입에는 새로운 기능을 추가할 수 있지만 기존에 존재하는 기능을 오버라이드 할 수는 없다.

연산 타입 프로퍼티 예제

  • 익스텐션을 통해서 타입에 연산 프로퍼티를 추가할 수 있다.
  • static 키워드를 사용하여 타입 연산 프로퍼티도 추가할 수 있다.
  • 저장 프로퍼티는 추가할 수 없으며, 타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 감시자를 추가할 수 없다.

extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
    
    var isOdd: Bool {
        return self % 2 == 1
    }
}

var number = 3

number.isOdd // true
number.isEven // false

extension String {
    func convertToInt() -> Int? {
        return Int(self)
    }
}

var string = "0"
string.convertToInt() // "0" => 0

메서드

extension Int {
    func multiply(by n: Int) -> Int {
        return self * n
    }
    
    mutating func multiplySelf(by n: Int) {
        self = self.multiply(by: n)
    }
    
    static func isIntTypeInstance(_ instance: Any) -> Bool {
        return instance is Int
    }
}

var number: Int = 3

number.multiply(by: 2)
print(number)   //3

number.multiplySelf(by: 3)
print(number)   //9

number.multiplySelf(by: 3)
print(number)   //27

print(Int.isIntTypeInstance(number))    //true

이니셜라이저

  • 클래스 타입은 편의 이니셜라이저는 추가할 수 있지만, 지정 이니셜라이저는 추가할 수 없다.
  • 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 한다.
  • 익스텐션을 통해 추가하는 이니셜라이저는 타입의 기존 이니셜라이저가 하는 일을 동일하게 수행해야 한다.
extension String {
    init(intTypeNumber: Int) {
        self = "\(intTypeNumber)"
    }
    
    init(doubleTypeNumber: Double) {
        self = "\(doubleTypeNumber)"
    }
}

let stringFromInt: String = String(intTypeNumber: 100)
let stringFromDouble: String = String(doubleTypeNumber: 100.0)

print(stringFromInt)    //100
print(stringFromDouble)     //100.0

class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

extension Person {
    convenience init() {
        self.init(name: "Unknown")
    }
}

let someOne: Person = Person()
print(someOne.name)     //Unknown

서브스크립트

  • 익스텐션을 통해 타입에 서브스크립트를 추가할 수 있다.
extension String {
    subscript(appedValue: String) -> String {
        return self + appedValue
    }
    
    subscript(repeatCount: Int) -> String {
        var str: String = ""
        
        for _ in 0..<repeatCount {
            str += self
        }
        
        return str
    }
}

print("abc"["def"])     //abcdef
print("abc"[3])     //abcabcabc
profile
마음이 시키는 프론트엔드.. RN과 IOS를 곁들인..

0개의 댓글