[swift 기초문법] - 익스텐션(Extension)
익스텐션이란(Extension)
익스텐션은 Objective-C의 카테고리(Category)와 유사합니다.
카테고리는 이름을 명명해야했지만 스위프트의 익스텐션은 이름이 없습니다.
확장이란 뜻처럼 있는 클래스, 구조체, 열거형, 프로토콜 타입등에 새로운 기능을 추가하여 확장할 수 있는 기능입니다.
기존에 존재하는 기능을 재정의할 수는 없습니다.
익스텐션에 추가할 수 있는 항목은 연산 타입/연산 인스턴스 프로퍼티, 타입/인스턴스 메서드, 이니셜라이저, 서브스크립트, 중첩 타입, 특정 프로토콜을 준수할 수 있도록 기능 추가가 있습니다.
외부에서 가져온 프레임워크나 라이브러리에 내가 원하는 기능을 추가하고자 할 때 사용하면 유용합니다.
extension이라는 키워드를 사용합니다.
extension 확장할 타입 이름 {
//기능 구현
}
익스텐션에서의 이니셜라이저
익스텐션에서 이니셜라이저를 추가할때는 아래와같은 조건이 있습니다.
클래스 타입에 편의 이니셜라이저는 추가할 수 있지만, 지정 이니셜라이저는 추가할 수 없습니다.
값 타입에서는 편의/지정 이니셜라이저를 추가할 수 있습니다.
값 타입의 이니셜라이저에서 그 타입의 기본 이니셜라이저와 멤버아이즈 이니셜라이저를 호출하려면 그 값 타입의 모든 저장 프로퍼티가 기본값을 가지고 있어야하고 기본 이니셜라이저와 멤버와이즈 이니셜라이저 외에 추가적인 사용자정의 이니셜라이저를 가지고 있지 않아야합니다.
struct Rect {
var x: CGFloat = 0
var y: CGFloat = 0
}
extention Rect {
init(width: CGFloat, height: CGFloat) {
//구현
self.init(x: 9, y: 8)
}
}
[swift 기초문법] - 제네릭(Generic)
제네릭(Generic)
타입 또는 메서드의 일므 뒤에 부등호 기호(<>) 사이에 제네릭을 위한 타입 매개변수를 표시하여 제네릭을 사용할 것임을 표시합니다.
Int나 String 같은 실제 타입 이름을 써주는 대신에 플레이스홀더(Placeholder)을 사용합니다.
플레이스 홀더는 T로 표현합니다.
T는 특정 타입의 종류의 종류를 알려주지는 않지만 타입이란것만 알려줍니다.
함수가 호출되는 순간 T의 실제타입이 결정됩니다.
타입이름 <타입 매개변수>
func 함수이름<타입 매개변수>(함수의 매개변수) {
}
func somethingMethod<T>(a: T, b: T) {
}
제테릭 타입
구조체, 클래스, 열거형 등이 어떤 타입과도 동작하게 할 수 있습니다.
Element
struct SomethingStruct<Element> {
var items = [Element]()
}
제네릭의 익스텐션
extension을 사용하여 제네릭을 확장할때는 타입 매개변수를 명시하지 않으나 원래 제네릭 정의에 명시된 태입 매개변수를 익스텐션에서 사용가능합니다.
extension SomethingStruct{
var test: Element? {
return self.items.first
}
}
제테릭의 타입제약(Type Constraints)
타입 매개변수가 가져야 할 제약사항을 지정할 수 있는 방법입니다.
클래스 타입 또는 프로토콜만 줄 수 있습니다.
타입 매개변수 뒤에 콜론을 붙인 후 원하는 클래스 타입 또는 프로토콜을 명시합니다.
딕셔너리의 키는 Hashable 프로토콜을 준수하는 타입만 사용될 수 있습니다.
public struct Dictionary<Key : Hashable, Value> : Collection,
ExpressibleByDictionaryLiteral {...}
여러 제약을 사용하고 싶다면 where절을 사용합니다.
struct SomethingStruct<T: Integer>(a: T) where T: FloatingPoint, T: Equatable {
var items = [Element]()
}
#swift 기초
#swift 강의
#ios programming
'IT > Swift' 카테고리의 다른 글
[swift] POP (Protocol Oriented Language) (0) | 2019.09.30 |
---|---|
[swift] Protocol Default Implementations, Associated Type (0) | 2019.09.28 |
[swift] Type Casting (0) | 2019.09.23 |
[swift] Inheritance (0) | 2019.09.22 |
[swift] Subscript (0) | 2019.09.19 |