본문 바로가기
FE 공부/Swift

Swift _ Extensions

by 꼬질꼬질두부 2022. 10. 11.
반응형

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

댓글