기존 존재하는 구조체, 클래스, 열거형 등의 객체에 새로운 기능을 추가

제약사항

Double extension 예제

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 description:String{
        return "asdf"
    }
}
2.km
5.5.cm
125.m

let distance = 42.0.km+195.m
print("\\(distance)") //42195.0

익스텐션과 메소드

기존 객체에 존재하는 메소드를 익스텐션에서 재정의하는 것은 허용하지 않음

extension Int{
    func repeatRun(task: () -> Void){
        for _ in 0..<self{
            task()
        }
    }
}

let d = 3
d.repeatRun {
    print("hello world!")
}
/*
hello world!
hello world!
hello world!
*/

익스텐션과 델리게이트 패턴

델리게이트 페턴 구현에 사용되는 프로토콜 관련 코드를 익스텐션을 이용해 정리 할 수 있음

class MyViewController : UIViewController{    
}
//MARK: 테이블 뷰 델리게이트
extension MyViewController : UITableViewDelegate,UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        <#code#>
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        <#code#>
    }
    
    
}
//MARK: 텍스트뷰 델리게이트
extension MyViewController : UITextViewDelegate{
    
}

프로토콜 관련 메소드를 다음처럼 외부로 빼서 해결 가능함