18. Extension

Kang.__.Mingu·2021년 7월 31일
0

1. Study Swift

목록 보기
18/25

이미 존재하는 형식을 확장하는 방법에 대해 공부

Extension-Syntax

익스텐션으로 형식을 확장하는 방법을 공부

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
    }
}

Adding Properties

익스텐션으로 계산 속성을 추가하는 코드를 작성

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

Adding Methods

익스텐션으로 메소드를 추가하는 코드를 작성

// 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")

Adding Initializers

익스텐션으로 생성자를 추가하는 코드를 작성

// 생성자 추가
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)

Adding Subscripts

익스텐션으로 서브스크립트를 추가하는 코드를 작성

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]
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글