반응형
Extensions
형식을 확장하는데 사용
: 속성 메소드 생성자와 같은 멤버들을 형식에 추가하는 것
원본은 그대로 두고 원하는 기능만 해당 타입에 확장시키는 것
확장할 수 있는 대상
: 별도의 코드 조각으로 구현해 형식과 연관시켜 기존 멤버와 함께 사용하는 것
Class / Structure / Enumeration / Protocol
기존 멤버에 추가는 가능하나 변형은 불가 _ overriding을 원한다면 상속을 통해 subclassing 해야함
(Adding Members O but, Overriding Members X)
extension Type{ // 기존에 존재하는 형식 이름
//형식에 추가 할 멤버 작성
//아래는 추가 가능한 멤버의 종류
computedProperty //계산 속성만 가능 (저장 속성 or Property Observer 추가는 불가)
computedTypeProperty
instanceMethod
typeMethod
initializer//간편 생성자만 추가 가능
subscript
NestedType
}
extension Type: Protocol, ...{
requirments
}
//example
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
Adding Properties 예제 _ 계산 속성 추가
//1
extension Date{
//날짜 형식. 읽기 전용 계산 속성으로 구현 후 년도를 return
var year: Int{
let cal = Calender.current
return cal.component(.year, from: self)
}
}
let today = Data() //현재 날짜 저장
today.year //2022
//2
extension Double{
//Double 형식
var radianValue: Double {
return (Double.pi * self) / 180.0
}
var degreeValue: Double {
return self * 180.0 / Double.pi
}
}
let dv = 45.0
dv.radianValue //0.785398163...
dv.radianValue.degreeValue //45 _ radianValue를 degreeValue로 바꿈
Adding Methods 예제
//1.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()
}
}
let c = 30.0
c.toFahrenheit(from: 30.0) //86
Double.converToFahrenheit(from: 30.0) //86
//2. Date 형식에 문자열 포멧팅 메소드 추가
extension Date{
func toString(format: String = "yyyyMMdd") -> String{
let privateFormatter = DateFormatter()
privateFormatter.dateFormat = format
return privateFormatter.string(from: self)
}
}
let today = Data()
today.toString()//20221010
today.toString(format: "MM/dd/yyyy") //10/10/2022
Adding Subscripts 예제
//1.String 형식에 정수 인덱스를 처리하는 서브스크립트 추가
extension String(){
subscript (idx: Int) -> String? {
guard (0..<count).contains(idx) else{
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
let str = "Swift"
str[1] //w
str[100] //nil
//2.Data 형식에 컴포넌트를 리턴하는 서브스크립트 추가
extension Data(){
subscript (component: Calender.Component) -> Int? {
let tcal = Calender.current
return cal.component(component, from: self)
}
}
let today = Data()
today[.year]//2022
today[.month]//10
반응형
'FE 공부 > Swift' 카테고리의 다른 글
Swift _ Generics (0) | 2022.10.11 |
---|---|
Swift _ Protocols (0) | 2022.10.11 |
Swift _ Method & Subscript (0) | 2022.10.10 |
Swift_Structure & Class (0) | 2022.10.10 |
Swift _ Collection (2) | 2022.10.04 |
댓글