[Swift] 익스텐션에 대해 알아보자!

zooneon·2020년 11월 26일
1

Swift 기본 문법

목록 보기
13/14

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

익스텐션

  • 익스텐션을 이용하여 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있다.
  • 익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없다.
  • 주로 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용한다.
  • 익스텐션은 모든 타입에 적용할 수 있다.
extension 확장할 타입 이름 {
	 //타입에 추가될 새로운 기능 구현
}

extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 {
	//프로토콜 요구사항 구현
}
  • 익스텐션은 extension 이라는 키워드를 사용하여 선언한다.
  • 익스텐션은 기존에 존재하는 타입이 추가로 다른 프로토콜을 채택할 수 있도록 확장할 수 있다.

익스텐션으로 추가할 수 있는 기능

연산 프로퍼티

  • 익스텐션을 통해서 타입에 연산 프로퍼티를 추가할 수 있다.
  • static 키워드를 사용하여 타입 연산 프로퍼티도 추가할 수 있다.
  • 저장 프로퍼티는 추가할 수 없으며, 타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 감시자를 추가할 수 없다.
extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
    
    var isOdd: Bool {
        return self % 2 == 1
    }
}

print(1.isEven)     //false
print(1.isOdd)      //true

var number: Int = 2
print(number.isEven)    //true
print(number.isOdd)     //false

메서드

  • 익스텐션을 통해 타입에 메서드를 추가할 수 있다.
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
블로그 이전했습니다. https://blog.zooneon.dev

0개의 댓글