기존 타입에 새로운 메서드를 추가할 수 있습니다.
extension String {
func reversedString() -> String {
return String(self.reversed())
}
}
// 사용 예시
let greeting = "Hello"
print(greeting.reversedString()) // "olleH"
새로운 계산된 프로퍼티를 추가할 수 있습니다.
저장 프로퍼티는 추가할 수 없습니다.
extension Int {
var squared: Int {
return self * self
}
}
// 사용 예시
let number = 4
print(number.squared) // 16
초기화 메서드(init)을 추가할 수 있습니다.
단, 기존 초기화 메서드를 대체할 수는 없습니다.
extension UIColor {
convenience init(hex: String) {
let scanner = Scanner(string: hex)
scanner.currentIndex = hex.startIndex
var hexValue: UInt64 = 0
scanner.scanHexInt64(&hexValue)
let red = CGFloat((hexValue & 0xFF0000) >> 16) / 255.0
let green = CGFloat((hexValue & 0x00FF00) >> 8) / 255.0
let blue = CGFloat(hexValue & 0x0000FF) / 255.0
self.init(red: red, green: green, blue: blue, alpha: 1.0)
}
}
// 사용 예시
let color = UIColor(hex: "FF5733")
타입에 서브스크립트를 추가할 수 있습니다.
protocol Greetable {
func greet()
}
extension String: Greetable {
func greet() {
print("Hello, \(self)!")
}
}
// 사용 예시
let name = "Swift"
name.greet() // "Hello, Swift!"
extension을 사용해 타입이 특정 프로토콜을 채택하고 구현할 수 있습니다.
extension Array {
subscript(safe index: Int) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
// 사용 예시
let numbers = [1, 2, 3]
print(numbers[safe: 1]) // 2
print(numbers[safe: 5]) // nil
class UIStackViewFactory {
static func createStackView(axis: NSLayoutConstraint.Axis, spacing: CGFloat, alignment: UIStackView.Alignment) -> UIStackView {
let stackView = UIStackView()
stackView.axis = axis
stackView.spacing = spacing
stackView.alignment = alignment
return stackView
}
}
// 사용 예시
let buttonStack = UIStackViewFactory.createStackView(axis: .vertical, spacing: 10, alignment: .center)
import UIKit
extension UIStackView {
static func makeStackView(axis: NSLayoutConstraint.Axis, spacing: CGFloat, alignment: UIStackView.Alignment) -> UIStackView {
let stackView = UIStackView()
stackView.axis = axis
stackView.spacing = spacing
stackView.alignment = alignment
return stackView
}
}
//사용 예시
let buttonStack = UIStackView.makeStackView(axis: .vertical, spacing: 10, alignment: .center)
단순한 초기화에는 extension을 사용하는 것이 더 간결하고 유지보수하기 쉽다.
여러 타입의 객체를 생성하거나 복잡한 로직이 포함된 경우, 팩토리 패턴이 적합합니다.
UI 요소 생성처럼 반복적인 작업에는 extension을 활용하는 방식이 좋아보인다 !