티스토리 뷰

iOS 개발/Swift

[Swift 3] 확장 (Extensions)

beankhan 2017. 4. 22. 23:30

출처

http://kka7.tistory.com/26



확장 (Extensions)

기존에 있는 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가한다.
Objective C 의 카테고리와 유사하다.

할 수 있는 것들로는 아래 것들이 있다.

- 계산 인스턴스 프로퍼티와 계산 타입 프로퍼티를 추가할 수 있다.
- 인스턴스 메소드와 타입 메소드를 정의할 수 있다.
- 새로운 초기화를 제공할 수 있다.
- 서브스크립트를 정의할 수 있다.
- 새로 중첩된 타입을 정의하고 사용할 수 있다.
- 기존 타입에 프로토콜을 적용할 수 있다.


문법

extension SomeType {

    // new functionality to add to SomeType goes here

}


extension SomeType: SomeProtocol, AnotherProtocol {

    // implementation of protocol requirements goes here

}





계산 프로퍼티 (Computed Properties)

기존 타입에 계산 인스턴스 프로퍼티와 
계산 타입 프로퍼티를 추가할 수 있다.

내장된 Double 타입에 계산 인스턴스 프로퍼티 5개를 추가하였으며
거리 단위 작업을 위해 기본적인 지원을 제공하였다.

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 }

}


let oneInch = 25.4.mm

print("One inch is \(oneInch) meters")

// Prints "One inch is 0.0254 meters"


let threeFeet = 3.ft

print("Three feet is \(threeFeet) meters")

// Prints "Three feet is 0.914399970739201 meters"



let aMarathon = 42.km + 195.m

print("A marathon is \(aMarathon) meters long")

// Prints "A marathon is 42195.0 meters long"



확장에서 새로운 계산 프로퍼티를 추가할 수 있지만
저장 프로퍼티나 기존 프로퍼티를 감시하는 옵저버는 추가할 수 없다.




초기화

확장은 기존 타입에 새로운 초기화를 추가할 수 있다.

타입의 원래 구현에 포함되어 있지 않은
사용자 정의 타입을 초기화 매개 변수에 적용하여
다른 타입을 확장 또는 추가적인 초기화 옵션을 제공하는게 가능하다.

확장은 클래스에 새로 편리한 초기화를 추가할 수 있지만
새로운 지정된 초기화나 해제는 추가할 수 없다.

지정된 초기화와 해제는 반드시 원래 클래스 구현에서 제공되어야한다.

struct Size {

    var width = 0.0, height = 0.0

}

struct Point {

    var x = 0.0, y = 0.0

}

struct Rect {

    var origin = Point()

    var size = Size()

}


let defaultRect = Rect()

let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),

                          size: Size(width: 5.0, height: 5.0))



extension Rect {

    init(center: Point, size: Size) {

        let originX = center.x - (size.width / 2)

        let originY = center.y - (size.height / 2)

        self.init(origin: Point(x: originX, y: originY), size: size)

    }

}


let centerRect = Rect(center: Point(x: 4.0, y: 4.0),

                      size: Size(width: 3.0, height: 3.0))

// centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0)






메소드

extension Int {

    func repetitions(task: () -> Void) {

        for _ in 0..<self {

            task()

        }

    }

}


3.repetitions {

    print("Hello!")

}




인스턴스 메소드 변경하기

확장으로 추가된 인스턴스 메소드는 인스턴스 스스로 수정할 수 있다.

구조체와 열거형의 메소드는 self 나 프로퍼티를 수정하려면
인스턴스 메소드에 만드시 mutating 표시를 해줘야하며
원래 구현으로 부터 메소드를 변경하는 것과 같다.

extension Int {

    mutating func square() {

        self = self * self

    }

}

var someInt = 3

someInt.square()

// someInt is now 9






서브스크립트

기존 타입에 새로운 서브스크립트를 추가할 수 있다.

extension Int {

    subscript(digitIndex: Int) -> Int {

        var decimalBase = 1

        for _ in 0..<digitIndex {

            decimalBase *= 10

        }

        return (self / decimalBase) % 10

    }

}

746381295[0]

// returns 5

746381295[1]

// returns 9

746381295[2]

// returns 2

746381295[8]

// returns 7





중첩된 타입

기존 클래스, 구조체, 열거형에 새로 중첩된 타입을 추가할 수 있다.


extension Int {

    enum Kind {

        case negative, zero, positive

    }

    var kind: Kind {

        switch self {

        case 0:

            return .zero

        case let x where x > 0:

            return .positive

        default:

            return .negative

        }

    }

}


func printIntegerKinds(_ numbers: [Int]) {

    for number in numbers {

        switch number.kind {

        case .negative:

            print("- ", terminator: "")

        case .zero:

            print("0 ", terminator: "")

        case .positive:

            print("+ ", terminator: "")

        }

    }

    print("")

}


printIntegerKinds([3, 19, -27, 0, -6, 0, 7])

// Prints "+ + - 0 - 0 + "



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함