iOS/Swift

[Swift] Extension์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๊ฒฝํ‘ธ 2023. 4. 13. 14:30
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ Extension์— ๋Œ€ํ•ด์„œ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค : )

 

Extension ์ด๋ž€?

Swift์˜ extension์€ ๊ธฐ์กด์˜ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ์˜ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ ํƒ€์ž…์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜, ํ”„๋กœํ† ์ฝœ ์ ์šฉ ๋“ฑ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

extension์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ํ™•์žฅํ•˜๋Š” ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

extension ํ™•์žฅํ•  ํƒ€์ž… {
   // ๊ธฐ๋Šฅ ๊ตฌํ˜„
}

 

์œ„ ๋ฌธ๋ฒ•์—์„œ ํ™•์žฅํ•  ํƒ€์ž…์€

๊ธฐ์กด์— ์ •์˜๋œ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ์˜ ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋Š” ๊ธฐ์กด ํƒ€์ž…์— ์ถ”๊ฐ€๋  ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ, ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์˜ ๋ฉค๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Int ํƒ€์ž…์— isEven์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด extension์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

extension Int {
  var isEven: Bool {
    return self % 2 == 0
  }
}

 

์œ„ ์ฝ”๋“œ์—์„œ

์•ž์„œ ๋ฌธ๋ฒ•์—์„œ ์„ค๋ช…ํ–ˆ๋˜

ํ™•์žฅํ•  ํƒ€์ž…์€ Int๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๊ณ  isEven์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ธฐ๋Šฅ๊ตฌํ˜„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Int ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์—์„œ isEven ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

let number = 10
print(number.isEven) // true

 

ํ”„๋กœํ† ์ฝœ ์ ์šฉ

extension์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ํƒ€์ž…์— ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํƒ€์ž…์ด ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, CustomStringConvertible ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•˜์—ฌ

Person์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

struct Person {
  let name: String
  let age: Int
}

extension Person: CustomStringConvertible {

   var description: String {
     return "\(name)(์€/๋Š”) \(age)์‚ด์ž…๋‹ˆ๋‹ค."
   }
}

 

Person ๊ตฌ์กฐ์ฒด์— CustomStringConvertible ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•˜๊ณ 

description ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ Person ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ print ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

let person = Person(name: "๊ฒฝํ‘ธ", age: 20)
print(person) // ๊ฒฝํ‘ธ(์€/๋Š”) 20์‚ด์ž…๋‹ˆ๋‹ค.

 

์ œ๋„ค๋ฆญ ํƒ€์ž… ํ™•์žฅ

extension์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Array ํƒ€์ž…์— lastIndex(of:) ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด extension์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

extension Array where Element: Equatable {

  func lastIndex(of element: Element) -> Int? {
    for (index, item) in self.enumerated().reversed() {
      if item == element {
        return index
      }
    }
    return nil
  }
  
}

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” Array ํƒ€์ž…์— where ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ Element๊ฐ€ Equatable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ

lastIndex(of:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Array ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์—์„œ lastIndex(of:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

let numbers = [1, 3, 5, 3, 7, 9, 3]
print(numbers.lastIndex(of: 3)) // Optional(6)

 

 

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ถ”๊ฐ€

extension์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํƒ€์ž…์— ๋‹ค์–‘ํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, Date ํƒ€์ž…์— String ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„

Date ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

extension Date {

  init?(fromString dateString: String, format: String = "yyyy-MM-dd") {
  
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    
    if let date = dateFormatter.date(from: dateString) {
      self = date
    } else {
      return nil
    }
  }
}

 

extension์„ ์‚ฌ์šฉํ•˜์—ฌ Date ํƒ€์ž…์— ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์˜€๊ณ 

String ๊ฐ’๊ณผ format ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ Date ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ดˆ๊ธฐํ™”์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ nil์„ ๋ฐ˜ํ™˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

Date ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ fromString ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

let dateString = "2022-04-01"
if let date = Date(fromString: dateString) {
  print(date) // 2022-04-01 00:00:00 +0000
}

if let date = Date(fromString: dateString, format: "yyyy/MM/dd") {
  print(date) // 2022-04-01 00:00:00 +0000
}

 


 

์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋งŒ  ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•