Swift

Extension - 1

728x90

안녕하세요:)

 

이번에는 익스텐션으로 형식을 확장하는 방법에 대해서 알아보도록 하겠습니다.

 

1. Extension

  • 형식을 확장하는데 사용합니다.
  • 속성, 메소드, 생성자 같은 멤버들을 형식에 추가하는 것입니다.
  • 익스텐션으로 확장할 수 있는 대상은 클래스, 구조체, 열거형, 프로토콜입니다.
  • 기존 멤버를 오버라이딩 하는 것은 불가능합니다. 오버라이딩이 필요하다면 상속을 통해 서브클래싱 해야합니다.
extension Type {
    computedProperty
    computedTypeProperty
    instanceMethod
    typeMethod
    initialzier
    subscript
    NestedType
}

extension Type: Protocol, ... {
    requirements
}
struct Size {
    var width = 0.0
    var height = 0.0
}

extension Size {
    var area: Double {
        return width * height
    }
}

let s = Size()
s.width
s.height
s.area

// 원본 형식을 수정할 수 없는 경우에는 extension으로 프로토콜 구현을 추가합니다.
extension Size: Equatable {
    public static func == (lhs: Size, rhs: Size) -> Bool {
        return lhs.width == rhs.width && lhs.height == rhs.height
    }
}

2. Adding property

  • 익스텐션으로 추가할 수 있는 속성은 계산 속성으로 제한됩니다.
  • 저장속성을 추가하거나 프로퍼티 옵저버를 추가하는 것을 불가능합니다.
extension Date {
    var year: Int {
        let cal = Calendar.current
        return cal.component(.year, from: self)
    }
    
    var month: Int {
        let mon = Calendar.current
        return mon.component(.month, from: self)
    }
    
    var day: Int {
        let day = Calendar.current
        return day.component(.day, from: self)
    }
}

let today = Date()
today.year
today.month
today.day

3. Adding Method

// Double에 저장된 실수를 섭시온도 화씨온도로 변환하는 코드입니다.
extension Double {
    func toFahrenheit() -> Double {
        return self * 9 / 5 + 32
    }
    
    func toCelsius() -> Double {
        return (self - 32) * 5 / 9
    }
    
    static func converToFahrenheit(from celsius: Double) -> Double {
        return celsius.toFahrenheit()
    }
    
    static func converToCelsius(from toFahrenheit: Double) -> Double {
        return toFahrenheit.toCelsius()
    }
}

let c = 30.0
c.toFahrenheit()
Double.converToFahrenheit(from: 30.0)
c.toCelsius()
Double.converToCelsius(from: 30.0)
// 날짜를 문자열로 포멧팅하는 메소드를 추가해보겠습니다.
extension Date {
    func toString(format: String = "yyyyMMdd") -> String {
        let privateFormatter = DateFormatter()
        privateFormatter.dateFormat = format
        return privateFormatter.string(from: self)
    }
}

let today = Date()
today.toString()
today.toString(format: "MM/dd/yyyy")

 

728x90

'Swift' 카테고리의 다른 글

Extension - 2  (0) 2020.12.14
Required Initializer & Failable Initializer  (0) 2020.12.14
Class Initializer  (0) 2020.12.14
Initializer & Memberwise Initializer  (0) 2020.12.07
AnyObject & Overloading  (0) 2020.12.07