[Swift] Special Literal 알아보기

#file #line #function 코드가 초면이시라구요?

naljin
12 min readJan 25, 2022

들어가기 전에

개-하! #file , #line, #function 뭐 이런 코드 본적 있으신가여? 초면이시라면,, 잘 찾아오셨습니당. 오늘은 얘네들에 대해서 다룰 예정이거든여

🤔 그래서 얘네가 먼데??????

흠냐리 초면이라고 생각하겠지만,, 사실 fatalErrorassert 를 한번쯤 사용해봤다면 내부적으로 사용해왔던건디요! fatalError 등을 마주쳤을때 뿜는 에러 로그에서 보이는 파일 이름과 라인 넘버,, 도대체 어디서 온 애들인가 궁금한적 없으셨나여!? 물론 전 없었음여 ㅋ

이제부터 궁금해보기로 하져 ㄱㄱ fatalError의 시그니처를 살펴볼까여??

헉스 fileline 파라미터에 각각 디폴트 값으로 #file, #line 이 들어가있네여. 얘네들을 이용해서 file 이름과 line 넘버를 알 수 있었던건가,,라고 추측 ssap 가능한 부분?!

그럼 요런 애들은 도대체 뭐라고 부르는지, 비슷한 애들은 뭐가 있는지 궁금하지 않으신가여? 저는 궁금했어여. 요기에서 의문점 시작 ㄱㄱ!

Literal 이란 무엇인가

swift #file 로 구글링을 하면 나오는 공식 문서가 요거였는데여

Literal Expression 항목에 가면 이렇게 설명하면서 냅다 제가 찾는 정보들이 나옴여

Literal Expression은 일반 리터럴(문자열이나 숫자), array 리터럴 또는 dictionary 리터럴, playground 리터럴 또는 다음과 같은 Special Literal로 구성된다.

엥?????? 뭔 소리야????? 애시당초 literal 이 뭔데?????? 파파고야 도와줘!!

ㅇㅋ 도움이 안되는군

스위프트 공식 문서야 도와줘!

literal은 숫자나 문자열과 같은 type의 값(value)을 소스코드로 표현한 것

??? 음,, 알것 같기도 하고,, 그럼 예시를 볼까여?

42               // Integer literal
3.14159 // Floating-point literal
"Hello, world!" // String literal
true // Boolean literal

그렇슴다. 42 / 3.14159 / "Hello, world" / true 같은 것들이 걍 모두 literal 이었네여. 쏘 간단쓰~ ㄹㅇ "문자 그대로"라는 의미였잖아여???

보다시피 리터럴 자체에는 type 이 없습니다. 대신 스위프트의 타입 추론에 의해 리터럴의 타입이 추론됩니다.

예를 들어 let x: Int8 = 42 에서는 : Int8 처럼 명시적 type 선언을 사용함으로써 integer literal 42 의 형식이 Int8 으로 추론되는거져!

리터럴에 대한 적합한 type 정보가 없는 경우에는 표준 라이브러리에 정의된 기본 리터럴 type 중 하나라고 추론합니다. 기본 type은 integer literal의 경우 Int, floating-point literal의 경우 Double, string literal 경우 String, boolean literal 의 경우 Bool 입니다.

예를 들어, let str = "Hello, world" 에서 "Hello, world" 문자열의 기본 유추 type은 String이고, let number = 12.2 에서 12.2 의 type 은 Double 이 됩니다

기본 리터럴에 대한 문법이 더 궁금하다면 요기에서 찬찬히 찾아보기로 하시고여

Special Literal

그럼 아까 Literal Expression 에 있었던 설명을 가져와 볼게여

Literal Expression은 일반 리터럴(문자열이나 숫자), array 리터럴 또는 dictionary 리터럴, playground 리터럴 또는 다음과 같은 Special Literal로 구성된다.

ㅇㅋㅇㅋ 이제

  • 일반 리터럴 — 문자열("Hello world")이나 숫자 (2022)
  • array 리터럴 — [1,2,3]
  • dictionary 리터럴 — ["id" : 8]

은 대충 감 왔져!?

이어서 playground 리터럴도 잠깐 살펴보자면, Xcode에서 색, 파일, 이미지를 interactive 하게 표현하기 위해 사용하는 것으로

  • #colorLiteral(red:,green:,blue:,alpha:)
  • #fileLiteral(resourceName:)
  • #imageLiteral(resourceName:)

등이 있는데 요게 알고 싶은게 아니니 일단 넘어가기로 합시다. 그럼 Special Literal 하나 남았다 이 놈!

표를 해석하는 방법을 알아보기 위해 우선 맨 첫번째 줄만 보면, #file 자체가 literal이고, Type은 String 이네여.

이전에 "Hello world" 자체가 literal 이고, Type 이 String 이었던거를 생각해보면 대입해서 딱딱 이해가 되시나여??

직접 쳐보면 String 타입이라고 나오는거 제법 신기쓰~

그럼 일단 viewDidLoad 에서 한번 냅다 print 해볼까여??

결과는 이렇습니다

file: /Users/sujikang/Desktop/Sample/Sample/ViewController.swift
filePath: /Users/sujikang/Desktop/Sample/Sample/ViewController.swift
fileID: Sample/ViewController.swift
line: 39
column: 19
function: viewDidLoad()
dsohandle: 0x0000000100a52000

이제 하나씩 살펴보도록 하져

#file

/Users/sujikang/Desktop/Sample/Sample/ViewController.swift
  • 표현식이 등장하는 파일의 경로를 나타냅니다
  • #file의 string 값은 언어 버전에 따라 달라집니다. 현재 #file의 값은 #filePath 의 값과 동일하지만, 이후 버전의 스위프트에서는 #fileID과 동일한 값을 가질 것입니다.

#filePath

/Users/sujikang/Desktop/Sample/Sample/ViewController.swift
  • 표현식이 등장하는 파일의 전체 시스템 경로를 나타냅니다
  • test, build script 코드 외부에서 사용하지 않도록 합니다.

#fileID

Sample/ViewController.swift
  • 모듈 및 파일의 이름입니다
  • module/file 형식을 갖습니다. 여기서 file은 표현식이 등장하는 파일의 이름이고 module은 이 파일이 속한 모듈의 이름입니다
  • #fileID#filePath와 달리 소스 파일의 전체 경로를 포함하지 않기 때문에, 더 나은 privacy 를 제공하고 컴파일된 바이너리의 크기를 줄여줍니다.

#line

39
  • 표현식이 등장하는 line 의 번호를 나타냅니다

#column

19
  • 표현식이 시작하는 column 번호를 나타냅니다

#function

viewDidLoad()
  • 표현식이 나타나는 선언부(declaration)의 이름입니다.
  • function 내부에서는 function의 이름이고, method 내부에서는 method의 이름이고, property getter 나 setter 내부에서는 property 의 이름이고, init 이나 subscript 같은 special member 내부에서는 keyword의 이름이고, file의 최상위 수준에서는 현재 모듈의 이름입니다.

#dsohandle

  • dynamic shared object (i.e: containing executable or dylib image)를 반환하고 일반적으로 로깅과 함께 사용되는 UnsecurableRawPointer를 반환합니다.
  • 사실 잘 뭔지 모르겠어여 ㅋ,,

함수에서 special literal 를 default value 로 사용하기

아까 우리가 fatalError 의 시그니처 부분을 살펴봤는디요

여기 default value 로 떡하니 #file, #line 이라는 special literal 이 들어가있었져?!

흠,, 이러면 fatalError 가 정의된 부분의 #file#line 정보가 찍히지 않으려나????? 생각이 들수도 있지만~~! special literal 가 함수 또는 메서드 parameter의 default value로 사용될 때, 해당 값은 호출하는 곳에서 결정됩니다.

뭔가 로깅 시스템에서 잘 사용할 수 있겠다 생각이 들지 않나염!?!!

마무리

오늘은 number sign (#) 으로 시작하는 키워드들 중

https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html

special literal (#file, #fileID, #filePath, #line, #column , #function, #dsohandle)에 대해 집중적으로 살펴보고

중간에 playground literal (#colorLiteral, #fileLiteral, #imageLiteral) 도 스윽 봤는데여!

다음엔

요 문서를 참고해서 #으로 시작하는 다른 키워드들도 다뤄보는 주제로 돌아,,오고 싶네여? 못돌아오면 어쩔수 없고여 ㅋㅎ

  • Conditional Compilation Block — #if, #elseif, #else, #endif
  • Line Control Statement — #sourceLocation
  • Compile-Time Diagnostic Statement — #error, #warning
  • Availability Condition- #available

그럼 20000!

+) 돌아오기 성공!

참고

--

--

No responses yet