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 |