[Swift] ν™•μž₯ (Extension)

KiwiΒ·2024λ…„ 3μ›” 19일

Swift

λͺ©λ‘ 보기
17/21
post-thumbnail

πŸ“ Extension

extension은 κΈ°μ‘΄ νƒ€μž…μ— κΈ°λŠ₯을 μΆ”κ°€ν•œλ‹€. μ—¬κΈ°μ„œ 기쑴의 νƒ€μž…μ€ ꡬ쑰체, μ—΄κ±°ν˜•, 클래슀λ₯Ό λ§ν•œλ‹€. ν™•μž₯은 νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, 기쑴에 μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯을 μž¬μ •μ˜ν•  μˆ˜λŠ” μ—†λ‹€! κ·Έλ ‡λ‹€κ³  κΈ°λŠ₯을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ νƒ€μž…μ˜ κ΅¬ν˜„λœ λͺ¨λ“  μ†ŒμŠ€μ½”λ“œλ₯Ό μ•Œ μˆ˜λŠ” μ—†λ‹€. extension은 νƒ€μž…λ§Œ μ•Œκ³  μžˆλ‹€λ©΄ κ·Έ νƒ€μž…μ˜ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

Extension ꡬ문

extension ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν™•μž₯을 μ„ μ–Έν•œλ‹€.

extension SomeType {

}

struct Person {
	let name: String
    var country: String
    let isMale: Bool
}

extension Person {
	let age: Int
    let bloodType: String
    var height: Float
}

ν™•μž₯으둜 기쑴에 μ‘΄μž¬ν•˜λŠ” νƒ€μž…μ΄ ν”„λ‘œν† μ½œμ„ 채택할 수 μžˆλ‹€. μ΄λ•Œ ν”„λ‘œν† μ½œμ„ 닀쀑 채택할 수 μžˆλ‹€.

extension SomeType: SomeProtocol, AnotherProtocol {
    
}

extension κ΅¬λ¬ΈμœΌλ‘œλŠ” λ‹€μ–‘ν•œ 것듀이 κ°€λŠ₯ν•˜λ‹€. κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μ—°μ‚° ν”„λ‘œνΌν‹°(computed property)λ₯Ό μΆ”κ°€, μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€/νƒ€μž… λ©”μ„œλ“œ μΆ”κ°€, μ΄ˆκΈ°ν™” ꡬ문 μΆ”κ°€, ν”„λ‘œν† μ½œ 채택, μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μΆ”κ°€, μ€‘μ²©νƒ€μž… μΆ”κ°€κ°€ κ°€λŠ₯ν•˜λ‹€.

πŸ“ μ—°μ‚° ν”„λ‘œνΌν‹° μΆ”κ°€

ν™•μž₯은 κΈ°μ‘΄ νƒ€μž…μ— νƒ€μž… μ—°μ‚° ν”„λ‘œνΌν‹°μ™€ μΈμŠ€ν„΄μŠ€ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. μ—°μ‚° ν”„λ‘œνΌν‹°λΌκ³  νŠΉλ³„νžˆ μ§€μ •ν•œκ²ƒ 처럼 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μΆ”κ°€κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. λ˜ν•œ κΈ°μ‘΄ νƒ€μž…μ˜ μ €μž₯된 ν”„λ‘œνΌν‹°μ— κΈ°λ³Έκ°’ μ„€μ • μ‹œ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

extension String {
    var lastTwoWord: String {
        let suffixString = self.suffix(2)
        return String(suffixString)
    }
}

let str = "Hello"
print(str.lastTwoWord)	//"lo"

μœ„ μ½”λ“œλŠ” String νƒ€μž…μ— λŒ€ν•΄ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€. String νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ˜ λ§ˆμ§€λ§‰ 두 κΈ€μžλ₯Ό λ°˜ν™˜ν•΄μ£ΌλŠ” μ—°μ‚° ν”„λ‘œνΌν‹°μ΄λ‹€. μ΄λ ‡κ²Œ ν™•μž₯ν•΄μ£Όλ©΄ λͺ¨λ“  String νƒ€μž…μ—μ„œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 이 ν”„λ‘œνΌν‹°λŠ” μ½κΈ°μ „μš© μ—°μ‚°ν”„λ‘œνΌν‹°μ΄λ―€λ‘œ getν‚€μ›Œλ“œ 없이 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

🧐 μΈμŠ€ν„΄μŠ€ μ—°μ‚° ν”„λ‘œνΌν‹°μ™€ νƒ€μž… μ—°μ‚° ν”„λ‘œνΌν‹° : swiftμ—μ„œ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” 두가지 방법이닀.

  • νƒ€μž… μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” νƒ€μž… μžμ²΄μ™€ 관련이 μžˆλŠ” 값을 λ‚˜νƒ€λ‚΄λ©° staticν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž… 내뢀에 μ„ μ–Έν•œλ‹€. 그럼 ν•΄λ‹Ή νƒ€μž…μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜κ²Œ λœλ‹€.
  • μΈμŠ€ν„΄μŠ€ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” νŠΉμ • μΈμŠ€ν„΄μŠ€μ™€ 관련이 μžˆλŠ” 값을 λ‚˜νƒ€λ‚΄λ©° varν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž… 내뢀에 μ„ μ–Έλœλ‹€. μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ λ§ˆλ‹€ κ³ μœ ν•œ 값을 κ°€μ§„λ‹€.

πŸ“ μ΄ˆκΈ°ν™” ꡬ문 μΆ”κ°€

extension으둜 κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ 편의 μ΄ˆκΈ°ν™” ꡬ문을 μΆ”κ°€ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒˆλ‘œμš΄ μ§€μ • μ΄ˆκΈ°ν™” κ΅¬λ¬Έμ΄λ‚˜ μ΄ˆκΈ°ν™” ν•΄μ œ ꡬ문(λ””μ΄λ‹ˆμ…œλΌμ΄μ €)을 μΆ”κ°€ν•  μˆ˜λŠ” μ—†λ‹€. 이듀은 항상 κΈ°μ‘΄ 클래슀의 κ΅¬ν˜„λΆ€μ— μž‘μ„±λ˜μ–΄μ•Ό ν•œλ‹€. κ°’ νƒ€μž…(ꡬ쑰체,μ—΄κ±°ν˜•)은 상관없닀.

extension Double {
    init(fromString str: String) {
        self = Double(str) ?? 0.0
    }
}

let stringValue = "3.14"
let doubleValue = Double(fromString: stringValue) //3.14

이 μ½”λ“œλŠ” Double νƒ€μž…μ— λŒ€ν•œ ν™•μž₯을 μ •μ˜ν•˜κ³  μžˆλ‹€. λ§Œμ•½ μ΄ˆκΈ°ν™” ꡬ문으둜 받아듀인 λ¬Έμžμ—΄μ΄ Double둜 λ³€ν™˜ν•  수 μžˆλ‹€λ©΄ ν•΄λ‹Ή κ°’μœΌλ‘œ Double μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  μ•„λ‹ˆλ©΄ 0.0을 μ‚¬μš©ν•œλ‹€.

🧐 μ§€μ •μ΄ˆκΈ°ν™”μ™€ νŽΈμ˜μ΄ˆκΈ°ν™” : μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  κ·Έ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 두가지 μœ ν˜•

  • μ§€μ •μ΄ˆκΈ°ν™” : ν΄λž˜μŠ€λ‚˜ ꡬ쑰체의 λͺ¨λ“  μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” ꡬ문으둜 λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μ§€μ • μ΄ˆκΈ°ν™” ꡬ문이 μžˆμ–΄μ•Ό ν•œλ‹€! (ν”νžˆ μ΄ˆκΈ°ν™” ꡬ문이라고 λΆ€λ₯΄λŠ” 블둝)
  • νŽΈμ˜μ΄ˆκΈ°ν™” : μ΄ˆκΈ°ν™” μž‘μ—…μ„ 더 νŽΈλ¦¬ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ μ§€μ • μ΄ˆκΈ°ν™”λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν˜ΈμΆœν•  수 μž‡λŠ” 보쑰 μ΄ˆκΈ°ν™” μž‘μ—…μ„ λ‹΄λ‹Ήν•˜λŠ” ꡬ문으둜 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. convenienceν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. 보톡 λ§€κ°œλ³€μˆ˜μ˜ 일뢀 λ§Œμ„ λ°›μ•„ μ§€μ • μ΄ˆκΈ°ν™”λ₯Ό ν˜ΈμΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.
convenience init(name: String) {
        self.init(name: name, age: 0)
    }

πŸ“ λ©”μ„œλ“œ μΆ”κ°€

extension으둜 κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ νƒ€μž… λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

extension Int {
	func repetitions(task: () -> Void) {
    	for _ in 0..<self {
        	task()
         }
     }
}

3.repetitions{
	print("hello")
}
//hello
//hello
//hello

μœ„μ˜ μ½”λ“œλŠ” Intνƒ€μž…μœΌλ‘œ repetitionμ΄λΌλŠ” μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•œ μ˜ˆμ‹œμ΄λ‹€. 이 λ©”μ„œλ“œλŠ” νŒŒλΌλ―Έν„°κ°€ μ—†κ³  λ°˜ν™˜κ°’μ΄ μ—†λŠ” ν•¨μˆ˜νƒ€μž…μ„ 인수둜 κ°€μ§„λ‹€.
self λ˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•˜λŠ” ꡬ쑰체와 μ—΄κ±°ν˜• λ©”μ„œλ“œλŠ” 기쑴의 λ³€κ²½ λ©”μ„œλ“œμ™€ 같이 mutating 으둜 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν‘œμ‹œν•΄μ•Ό ν•œλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλŠ” μ›λž˜ μ œκ³΅λ˜λŠ” λ©”μ„œλ“œμΈ squareλΌλŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€λ‘œ λ³€κ²½ν•˜λŠ” μ½”λ“œμ΄λ‹€.

extension Int {
    mutating func square() {
        self = self * self
    }
}
var someInt = 3
someInt.square()	//someInt = 9

πŸ“ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ μΆ”κ°€

extension으둜 κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

struct Matrix {
    private var data: [[Int]]
    
    init(rows: Int, columns: Int) {
        data = Array(repeating: Array(repeating: 0, count: columns), count: rows)
    }
}

extension Matrix {
    subscript(row: Int, column: Int) -> Int {
        get {
            return data[row][column]
        }
        set {
            data[row][column] = newValue
        }
    }
}

var matrix = Matrix(rows: 5, columns: 5)
matrix[0, 0] = 1
matrix[1, 1] = 3
print(matrix)
//Matrix(data: [[1, 0, 0, 0, 0], [0, 3, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])

πŸ“ ν”„λ‘œν† μ½œ 채택과 κ΅¬ν˜„

extension을 μ΄μš©ν•΄μ„œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜μ—¬ ν”„λ‘œν† μ½œμ˜ 기본값을 섀정해쀄 수 μžˆλ‹€. ν”„λ‘œν† μ½œμ€ 틀을 λ§Œλ“œλŠ” μ½”λ“œλ‘œ μ‹€μ œλ‘œ κΈ°λŠ₯이 κ΅¬ν˜„λ˜μ§€ μ•Šμ€ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€. extension을 μ΄μš©ν•΄μ„œ ν”„λ‘œν† μ½œμ— κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

protocol Printable {
    func printDescription()
}

extension Printable {
	func printDescription(){
    	print("printing...")
     }
}

struct MyPrint: Printable{}

let myprinter = MyPrint()
myprinter.printDescription() //printing...
profile
🐣 iOS Developer

0개의 λŒ“κΈ€