본문 바로가기

프로그래밍/SWIFT

Swift Optional 몇가지 실험

반응형

swift 문법을 조금 공부해 봤는데, Optional 이라는 개념이 나한테는 새로운 개념이라 몇가지 실험을 해 보았다.

우선 Optional 을 내가 이해한 것은 아래와 같다.

  • swift 에서 변수는 디폴트로 nil 을 허용하지 않는다. 
    • 이렇게 하는 편이 예상치 못한 NPE 오류를 방지하는 디자인이다. (내 추측)
  • 하지만 nil 이 필요한 변수가 있을 수 있다. 그래서 nil 도 assign 할 수 있는 Optional 변수형을 따로 만들었다.
  • Optional 은 nil 또는 값을 assign 할 수 있다.
  • 값이 들어가 있을 때에도 Optional(값) 형태로 한번 포장되어 있는 상태다.
    • 사용하려면 좀 번거롭지만, unwrap 작업이 필요하다.
    • unwrap 을 할 때에는 nil 인지를 먼저 확인하는 것이 선행되어야 NPE를 방지할 수 있기 때문에, optional binding 등 이걸 좀 더  쉽게하는 달달한문법 등이 도입되었다.

이정도 이해를 갖고, 몇가지 테스트를 하다가 for 문에서 사용하는 변수의 타입에 대해서 아래와 같은 현상을 관찰했다. for 문에서 값을 받아오는 변수에 타입을 지정하지 않았을 때, 변수는 과연 어떤 타입일까?

0. 테스트환경은 Apple Swift version 5.0.2 (swiftlang-1001.0.82.4 clang-1001.0.46.5)

1. (1) 모두 같은 Int 형식의 값을 이터레이트할 때에, 값을 받는 변수의 타입은 단순한 Int 였지만, (2) Optional<Int> 형식의 값이 하나 포함되어 있을 때에는, 값을 받는 변수 x의 타입은 모두 Optional<Int>였다.

  4> for x in [ 1, 2, 3 ] { print(x, type(of:x)) }
1 Int
2 Int
3 Int

  5> for x in [ 1, Optional(2), 3 ] { print(x, type(of:x)) }
Optional(1) Optional<Int>
Optional(2) Optional<Int>
Optional(3) Optional<Int>

2. (1) Int 형과 String 형이 혼합된 헤테로 컬렉션을 이터레이트하려고 하니, 명시적으로 as [Any] 로 타입을 알려주어야 한다는 에러가 발생하였고, (2) as [Any] 로 타입을 명시하여 실행하였을 때, type(of:) 로 확인한 타입은 한가지가 아니라, 각각의 타입이었다.

  6> for x in [ 1, "str", 3 ] { print(x, type(of:x)) }
error: repl.swift:6:10: error: heterogeneous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional
for x in [ 1, "str", 3 ] { print(x, type(of:x)) }
         ^~~~~~~~~~~~~~~
                         as [Any]


  6> for x in [ 1, "str", 3] as [Any] { print(x, type(of:x)) }
1 Int
str String
3 Int

3. 2번 실험을 보고, 1번 실험을 as [Any] 를 붙여 다시 실행하였더니, Int와 Optional<Int> 형이 혼합되었을 때에도, 각각 값의 타입을 Int, Optional<Int> 로 다르게 알려주었다.

  7> for x in [ 1, Optional(2), 3 ] as [Any] { print(x, type(of:x)) }
1 Int
Optional(2) Optional<Int>
3 Int

4. 독자들 중에서 이 현상에 대해 설명이 가능한 분이 있다면, 댓글로 설명해주세요.

728x90