# [Swift] Various usages of Extension

기존 존재하는 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가 할 수 있게 해준다

가독성있는 코드를 작성할때 사용할 뿐 아니라 외부 라이브러리, String, Int와 같은 Original 코드에 접근 할 수 없는 것에 기능을 추가할때 사용한다

  • 계산 속성 추가
  • 인스턴스 메소드 , 타입 메소드 추가
  • 이니셜라이저 추가
  • 서브스크립트 정의
  • 새로운 중첩 타입 정의
  • 프로토콜 추가

# Syntax

struct Size {
	var width = 0.0
	var height = 0.0
}

extension Size {
	var area: Double {
			return width * height
	}
}
//Equatble 프로토콜을 채용하여 extension 구현가능함
// 기존에 존재하는 메소드 오버라이드 불가
extension Size: Eqatable {
	public static func == (lhs: Size, rhs: Size) -> Bool {
		return lhs.width == rhs.width && lhs.height == rhs.height
	}
}

# Adding Properties

// 저장속성은 Extension으로 추가할수 없지만 계산속성은 추가가능함
extension Date {
	var year: Int {
		let cal = Calendar.current 
		return cal.component(.year, from: self)
	}
}

extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1_000.0 }
    var ft: Double { return self / 3.28084 }
}

# Adding Methods

extension Int {
    func repetitions(task: () -> ()) {
        for i in 0..<self {
            task()
        }
    }
}

3.repetitions {
    println("Goodbye!")
}

# Adding Initializers

Struct Size {
	var width = 0.0
	var height = 0.0
	/* 구조체에서 생성자를 아래와 같이 구현하면  디폴트 생성자가 구현이 되지 않는다 
근데 extension으로 추가해주면 디폴트 생성자도 구현이되고 여기서 생성자를 추가로 더 구현하지 않아도 되는 장점이있음
	init(value: Double){ 
		width = value
		height = value
	}
*/
}
extension Size {
	init(value: Double){
		width = value
		height = value
	}
Size()
Size(width: 12, height:10) 

# Adding Subscripts

extension Int {
    subscript(var digitIndex: Int) -> Int {
        var decimalBase = 1
            while digitIndex > 0 {
                decimalBase *= 10
                --digitIndex
            }
            return (self / decimalBase) % 10
    }print(a++)
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7