카테고리 없음

Swift) Optional

나태한개발 2024. 6. 27. 22:40

챌린지반 숙제

 

옵셔널 코드

옵셔널 소스를 보면 enum으로 선언 되어있는것을 볼 수 있다.

값이 없는 경우 none 케이스, 있는경우 some 케이스로 처리하는거 같다.

 

~Copyable(프로토콜)

이부분은 복사가 불가능 하다고 명시 해놓은것 이라고 한다.

이것은 안전한 메모리 관리를 돕는다고 한다.

 

어떤 코드 뭉치에 의해서 Optional(3) 형태로 출력이 되는가?

public protocol CustomStringConvertible {
    var description: String { get }
}
extension Optional: CustomStringConvertible {
    public var description: String {
        switch self {
        case .none:
            return "nil"
        case .some(let wrapped):
            return "Optional(\(wrapped))"
        }
    }
}


옵셔널이 Optional() 형태로 출력되는 이유는 Optional 타입의 CustomStringConvertible 프로토콜 준수하기 때문이라고 한다. 스위프트 표준 라이브러리는 Optional 타입이 CustomStringConvertible 프로토콜을 따르도록 하여 옵셔널 값을 적절한 문자열로 변환하는 메서드를 제공하고, 이는 description 프로퍼티를 통해 구현한다.

 

description

더 자세히 파보려고 했지만 apple 코드는 접근제한자로 막아놔 자세한 로직은 볼수 없다고 한다.

 

print(옵셔널)은 어떻게 작동을 하는가?

값이 있을때 :

 

  1. print(number) 함수 호출.
  2. print 함수는 String(describing: number)를 호출.
  3. String(describing: number)는 number가 CustomStringConvertible 프로토콜을 준수하는지 확인.
  4. number는 옵셔널이므로 description 프로퍼티를 호출.
  5. description 프로퍼티는 number가 .some(3) 상태임을 확인하고 "Optional(3)"을 반환.
  6. 반환된 문자열 "Optional(3)"을 print 함수가 콘솔에 출력.

 

값이 없을때 :

  1. print(noNumber) 함수 호출.
  2. print 함수는 String(describing: noNumber)를 호출.
  3. String(describing: noNumber)는 noNumber가 CustomStringConvertible 프로토콜을 준수하는지 확인.
  4. noNumber는 옵셔널이므로 description 프로퍼티를 호출.
  5. description 프로퍼티는 noNumber가 .none 상태임을 확인하고 "nil"을 반환.
  6. 반환된 문자열 "nil"을 print 함수가 콘솔에 출력.
  •