Open Do-hyun-Kim opened 1 year ago
기존 클래스, 구조체, 열거형 타입에 새로운
Property
,Method
,Initializer
등을 추가하는 것으로, 원본 타입(소스 코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있음
extension String {
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
let 황민채 = "Hwang! minchae"
print(황민채[5]!) //!
extension
키워드를 사용하여 extension 선언extension SomeType {
}
extension SomeType: SomeProtocol, AnotherProtocol {
}
extension Int {
var one: Int = 1
}
// error : Extensions must not contain stored properties
extension Int {
var twice: Int {
return self * 2
}
}
let num = 100
print(num.twice) // 200
print(num) // 100
// 타입 메서드
extension Int {
static func printOne() {
print(0)
}
}
Int.printOne() // 0
// 인스턴스 메서드
extension Int {
func printplus() {
print(self + self)
}
}
let num: Int = 100
num.printplus() // 200
extension String {
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
let string = "Hello World"
print(string[0]) // Optional("H")
print(string[5]) // Optional(" ")
print(string[50]) // nil
기존의 클래스, 구조체와 열거형 등에서 새로운 메서드나 연산 프로퍼티를 확장할 수 있게 해주는 기능이다.
class Obj {
var a: Int
var b: Int
...
}
extension Obj {
...
}
extension Obj {
// 일반 프로퍼티만 확장가능하며, 저장 프로퍼티는 확장불가능하다.
var sum: Int {
return self.a + self.b
}
}
extension Obj {
func printSomthing() {
print("printSomething")
}
}
extension Obj: AProtocol, BProtocol {
// 각 채택하는 프로토콜에 정의된 메서드 or 연산 프로퍼티 구현
...
}
extension Obj {
convenience init() {
self.init() // 지정 생성자 호출 필수
...
}
extension Obj {
enum TestEnum {
case ...
case ...
...
}
struct TestStruct {
...
}
}
// AProtocol 을 채택하는 Element의 경우만 아래 메서드 사용가능
extension Array where Element: AProtocol {
func onlyForAProtocol() {
...
}
}
// Int 형 Element를 갖는 Array의 경우만 아래 메서드 사용가능
extension Array where Element == Int {
func onlyForIntElement {
...
}
}
Extensions에 대해 설명하시오.
extensions
을 사용하여class
,struct
,enum
,protocl
타입에 새로운 기능을 부여 할 수있다.extensions
은 대체적으로 수평확장으로 이루어져 있으며 특정 타입의 기능을 물려 받는 것이 아닌 기존 타입에 기능을 추가하는 것이다.extensions
같은 경우 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없다 해도, 타입만 알 고 있다면 그 타입의 기능을 확장 시킬 수 있다.Extensions Syntax
Computed Properties
extensions
을 사용하여 해당 타입에 새로운 계산 속성 프로퍼티를 추가할 수 있다.extensions
에서 새로운 계산 속성 프로퍼티를 추가할 수 있지만 저장 속성 프로퍼티(Stored Properties), 기존 속성에 프로퍼티 옵저버(Property Observer)를 추가 할 수는 없다.Extensions Initializers
class
타입 은convenience init
를 추가 할 수 있지만,designated Initializer
는 추가 할 수 없다.designated Initializer
와deinitializer
는 반드시 클래스 타입의 구현부에 위치해야 한다.extensions
을 통해 추가하는 이니셜라이저는 타입의 기존 이니셜라이저가 하는 일을 동일하게 수행해야 한다.Extensions Method
extensions
을 사용하여 해당 타입에Instance Method
와Type Method
를 추가할 수 있다.extensions
내부에서mutating Instacne Method
도 추가 할 수 있다.Extensions Subscript
extensions
을 사용하여 해당 타입에 서브스크립트를 추가 할 수 있다.Extensions Nested Types
extensions
사용하여 해당 타입에 중첩 데이터 타입을 추가 할 수 있다.📝 참고 사이트