Swift Extension, Protocol

Jee.e (황지희)·2022년 4월 11일
0
post-custom-banner

Extension - 확장

  • 기존에 선언되어 있는 타입에 새로운 기능을 추가할 때 사용
  • 확장하려는 타입의 코드를 알지 못해도, 해당 타입의 기능 확장 가능 (타입 이름만 알면 됨)
extension SomeType {
    // new functionality to add to SomeType goes here
}

✅ Extension이 타입에 추가할 수 있는 기능

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 메서드 / 인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가

☑️ 이니셜 라이저의 예

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

//이니셜라이저
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)
    }
}

✅ 상속과의 차이점

상속확장
클래스만 구현 가능클래스, 구조체, 열거형, 제네릭 등 모든 타입에서 구현 가능
특정 타입을 물려받아 새로운 타입 정의 및 추가 기능 구현기존 타입에 추가 기능을 더하는 수평 확장
기존 기능 재정의 가능기존 기능 재정의 불가

ExtensionProtocol 구현시에도 사용되는데,
아래와 같이ExtensionProtocol 을 이용해 다중 상속처럼 사용할 수도 있다.

extension SomeType: SomeProtocol, AnotherProtocol {
    // implementation of protocol requirements goes here
}

Protocol

  • 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항의 청사진
  • 클래스, 구조체 또는 열거형에 채택해 사용
  • Protocol도 하나의 data type임
  • Protocol을 이용해 Delegate를 구현

// 구현 예
protocol SomeProtocol {
    // protocol definition goes here
}

// 사용 예
struct SomeStructure: FirstProtocol, AnotherProtocol {
    // structure definition goes here
}

✅ 유의사항

  • 프로토콜은 instance 또는 type property를 요구할 수 있다.
  • property name, type, gettable, settable만을 명시하며, 항상 var로 선언한다. (read-only 불가)
  • method를 정의할 때 curly braces {} 와 method body는 작성하지 않는다.
  • 파라미터의 기본값도 작성하지 않는다.
  • 프로토콜의 메서드가 자신이 속한 value type의 인스턴스 값을 변경해야 하는 경우, mutating 키워드를 붙여주어야 한다.

☑️ 프로토콜 사용 예

protocol Readable {
    func read()
}
protocol Writeable {
    func write()
}
protocol ReadWriteSpeakable: Readable, Writeable {
    func speak()
}

class someClass: ReadWriteSpeakable {
    func speak() {
        print("")
    }
    
    func read() {
        print("")
    }
    
    func write() {
        print("")
    }
}
profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.
post-custom-banner

0개의 댓글