Apple-CS-interview / iOS-CS-interview

7 stars 1 forks source link

Extension에 대해 설명하시오. #22

Open Do-hyun-Kim opened 1 year ago

Do-hyun-Kim commented 1 year ago

Extensions에 대해 설명하시오.

Extensions Syntax

public class Jenny {
    var age: Int
    var name: String

    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
}

protocol BehavioAble {
    func goShop() -> Void
    func goHome() -> Void
}

extension Jenny: BehavioAble {
    func goShop() {
        print("제니는 쇼핑하로 가고 있습니다.")
    }

    func goHome() {
        print("제니는 집으로 가고 있습니다.")
    }
}

Computed Properties

extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1_000.0 }
    var ft: Double { return self / 3.28084 }
}

extension Date {
    var year: Int { return Calendar.current.component(.year, from: self) }
    var month: Int { return Calendar.current.component(.month, from: self) }
    static var isFuture: Bool {
      return self.now.year > 2023 ? true : false
    }
}

let nowYear: Int = Date().year
let nowMonth: Int = Date().month
print("오늘 년도는 \(nowYear)")
print("오늘 월은 \(nowMonth)")

Extensions Initializers

public struct Milk {
    var name: String = ""
}

public struct Bean {
    var beans: String = ""
}

public struct CoffeeShop {
    var beans: Bean = Bean()
    var milks: Milk = Milk()
}

extension CoffeeShop {

    init(beans: String, milks: String) {
        self.init(beans: Bean(beans: beans), milks: Milk(name: milks))
    }
}

public class Human {
    var name: String
    var shoes: String
    var clothes: String

    init(name: String, shoes: String, clothes: String) {
        self.name = name
        self.shoes = shoes
        self.clothes = clothes
    }

}

extension Human {

    // 만약 지정 이니셜라이져를 Extensions 내부에 선언시 뜨는 오류
    // Designated initializer cannot be declared in an extension of 'Human'; did you mean this to be a convenience initializer?

    convenience init() {
        self.init(shoes: "나이키", clothes: "긴팔티")
    }

}

Extensions Method

extension Milk {
    mutating func changeMilk() {
        self.name = "서울우유"
    }
}

extension Human {

    func goHome(name: String) {
        print("\(name)은 지금 집 가고 있다.")
    }

    static func goHuman() {
        print("사람은 지금 집가고 있다")
    }

}

Extensions Subscript

extension String {
    subscript(index: Int) -> Character {

        return self[self.index(self.startIndex, offsetBy: index)]

    }

}

Extensions Nested Types

extension String {
    enum Tear {
        case bronze
        case silver
        case gold
        case platinum
        case ruby
    }

    func setMyTear(tear: Tear) -> Self {
        switch tear {
        case .bronze:
            return "브론즈 티어"
        case .silver:
            return "실버 티어"
        case .gold:
            return "골드 티어"
        case .platinum:
            return "플레티넘 티어"
        case .ruby:
            return "루비 티어"
        }
    }
}

📝 참고 사이트

Hminchae commented 1 year ago

Extension 이란

기존 클래스, 구조체, 열거형 타입에 새로운 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]!) //!

참고

vichye-1 commented 1 year ago

Extension이란?

Swift의 Extension에서 수행할 수 있는 것

Extension 구문

  1. extension 키워드를 사용하여 extension 선언
extension SomeType {

}
  1. extension은 하나 이상의 프로토콜을 채택하여 기존 타입을 확장할 수 있다.
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

확장에 서브 스크립트(Subscript) 추가

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

출처

ronick-grammer commented 1 year ago

Extension 이란

기존의 클래스, 구조체와 열거형 등에서 새로운 메서드나 연산 프로퍼티를 확장할 수 있게 해주는 기능이다.

class Obj { 
  var a: Int
  var b: Int

  ...
}

extension Obj {
...
}

Extension에 연산 프로퍼티 확장이 가능하다.

extension Obj {
  // 일반 프로퍼티만 확장가능하며, 저장 프로퍼티는 확장불가능하다.
  var sum: Int  {
      return self.a + self.b
  } 
}

Extension에 메서드 확장이 가능하다.

extension Obj {
  func printSomthing() {
     print("printSomething")
  }
}

Extension에 프로토콜 채택이 가능하다.

extension Obj: AProtocol, BProtocol {
// 각 채택하는 프로토콜에 정의된 메서드 or 연산 프로퍼티 구현
...
}

Extension에 생성자를 확장할 수 있다.

Extension에 중첩 타입을 확장할 수 있다.

extension Obj {
  enum TestEnum {
   case ...
   case ...
   ...
  }

  struct TestStruct {
    ...
  }  
}

Extension에 특정 조건을 걸어 제한을 둘 수 있다.

// AProtocol 을 채택하는 Element의 경우만 아래 메서드 사용가능
extension Array where Element: AProtocol { 
  func onlyForAProtocol() {
    ...
  }
}

// Int 형 Element를 갖는 Array의 경우만 아래 메서드 사용가능
extension Array where Element == Int {
  func onlyForIntElement {
    ...
  }
}

📝 참고 사이트