스위프트 투어 - 프로토콜과 익스텐션 Swift


프로토콜과 익스텐션

프로토콜을 정의하려면 protocol 을 사용한다.

protocol ExampleProtocol {
  var simpleDescription: String { get }
  mutating func adjust()
}

클래스들, 열거들, 구조체들은 프로토콜을 상속할 수 있다.

class SimpleClass: ExampleProtocol {
  var simpleDescription: String = "A very simple class."
  var anotherProperty: Int = 69015
  func adjust() {
    simpleDescription += " Now 100% adjusted."
  }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription

struct SimpleStructure : ExampleProtocol {
  var simpleDescription: String = "A simple structure"
  mutating func adjust() {
    simpleDescription += " (adjusted)"
  }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

SimpleStructure 의 정의에서 mutating 키워드의 사용은 스트럭쳐를 수정함을 나타내는 것이다. SimpleClass 는 뮤테이팅을 지정할 필요가 없는데 클래스의 메소드는 항상 클래스를 수정하기 때문이다.

extension 을 사용해 존재하는 형식에 새로운 메소드나 계산된 프로퍼티와 같은 추가적인 기능을 첨부한다. 형식으로 프로토콜 컨포먼스를 추가하는데 익스텐션을 사용할 수 있고 라이브러리나 프레임워크로부터 임포트한 형식까지도 가능하다.

extension Int: ExampleProtocol {
  var simpleDescription: String {
    return "The number \(self)"
  }
  mutating func adjust() {
    self += 42
  }
}
print(7.simpleDescription)

다른 이름지어진 형식과 같이 프로토콜의 이름을 사용할 수 있다. 예를 들어, 다른 형식을 갖는 객체의 콜랙션을 생성하지만, 모두 단일 프로토콜로 콘폼된다. 형식이 프로토콜 형식인 값들과 작업할 때 프로토콜 정의 외부의 메소드는 가용하지 않다.

let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)
// 

protocolValue 가 SimpleClass 의 런타임 형식을 가지고 있다고 해도, 컴파일러는 ExampleProtocol 의 주어진 형식으로 처리할 수 있다. 이 의미는 프로토콜에 맞춰 구현된 클래스의 메소드나 프로퍼티에 임의적으로 접근할 수 없다는 뜻이다.

덧글

댓글 입력 영역