이미 존재하는 형식을 확장하는 방법에 대해 공부
익스텐션으로 형식을 확장하는 방법을 공부
extension Type { computedProperty computedTypeProperty instanceMethod typeMethod initializer subscript NestedType } ---- extension Type: Protocol, ... { requirements }
확장 - 형식 확장(클래스, 열거형, 구조체, 프로토콜)
extension으로 추가할 수 있음
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 Size : Equatable {
public static func == (lhs: Size, rhs: Size) -> Bool
{
return lhs.width == rhs.width && lhs.height == rhs.height
}
}
익스텐션으로 계산 속성을 추가하는 코드를 작성
extension Date { // 날씨 데이터를 가져옴
var year: Int {
let cal = Calendar.current
return cal.component(.year, from: self)
}
var month: Int {
let cal = Calendar.current
return cal.component(.month, from: self)
}
var day: Int {
let cal = Calendar.current
return cal.component(.day, from: self)
}
}
// 현재 날짜
let today = Date()
today.year
today.month
today.day
extension 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
dv.radianValue.degreeValue
익스텐션으로 메소드를 추가하는 코드를 작성
// Double에 저장된 섭씨 온도와 화씨 온도로 변환하는 코드
extension Double {
func toFahrenheit() -> Double {
return self * 9 / 5 + 32
}
func toCelsius() -> Double {
return (self - 32) * 5 / 9
}
// 타입 메소드 구현
static func converToFahrenheit(form celsius: Double) -> Double {
return celsius.toFahrenheit()
}
}
let c = 30.0
c.toFahrenheit()
Double.converToFahrenheit(form: 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")
익스텐션으로 생성자를 추가하는 코드를 작성
// 생성자 추가
extension Date {
init?(year: Int, month: Int, day: Int) {
let cal = Calendar.current
var comp = DateComponents()
comp.year = year
comp.month = month
comp.day = day
guard let date = cal.date(from: comp) else {
return nil
}
self = date // 초기화
}
}
Date(year: 2014, month: 4, day: 18)
extension UIColor {
convenience init(red: Int, green: Int, blue: Int) {
self.init(red: CGFloat(red) / 255, green: CGFloat(green) / 255, blue: CGFloat(blue) / 255, alpha: 1.0)
}
}
UIColor(red: 77, green: 0, blue: 133)
struct Size {
var width = 0.0
var height = 0.0
}
// extension으로 생성자를 추가하면 생성하면 기본으로 정해진 생성자와 함께 사용할 수 있습니다.
extension Size {
init(value: Double) {
width = value
height = value
}
}
Size()
Size(width: 12, height: 34)
익스텐션으로 서브스크립트를 추가하는 코드를 작성
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]
str[100]
extension Date {
subscript(component: Calendar.Component) -> Int? {
let cal = Calendar.current
return cal.component(component, from: self)
}
}
let today = Date()
today[.year]
today[.month]
today[.day]