[2019.03.08]

원문 : 애플 개발 문서 Swift 5.0 Language Reference - Lexical Structure

어휘 구조(Lexical Structure)

Swift의 어휘 구조(lexical structure)는 언어의 유효한 토큰(tokens)을 구성하는 문자의 순서를 설명합니다. 이러한 유효한 토큰은 
언어의 가장 낮은 수준의 빌딩 블록(building block)을 형성하고 후속(subsequent) 장에서 나머지 언어를 설명하는데 사용됩니다. 토큰(token)은 식별자(identifier), 키워드(keyword), 구두점(punctuation), 리터럴(literal), 연산자(operator)로 구성됩니다.

대부분의 경우, 토큰은 아래에 지정된 문법의 제약 내에서, 입력 텍스트의 가장 긴 하위 문자열을 고려해서 Swift 소스파일의 문자들로부터 생성됩니다. 이러한 동작은 가장 긴 일치(longest match) 또는 최대 일치(maximal munch)라고 합니다.

공백와 주석(Whitespace and Comments)

공백(whitespace)는 2가지 용도가 있습니다: 소스파일에서 토큰을 분리하고 연산자(Operators 참조)가 접두사(prefix)인지 접미사(postfix)인지 결정하는데 도움이 되지만, 그렇지 않은 경우에는 무시됩니다. 다음에 오는 문자들은 공백으로 구성됩니다: 공간(space)(U+0020), 줄 바꿈(line feed)(U+000A), 캐리지 리턴(carriage return)(U+000D), 수평 탭(horizontal tab)(U+0009), 수직 탭(vertical tab)(U+000B), 폼 피드(form feed)(U+000C), null(U+0000).

주석(comments)는 컴파일러에 의해 공백(whitespace)으로 처리됩니다(treated). 한 줄 주석은 //으로 시작하고 줄 바꿈(line feed)(U+000A)나 캐리지 리턴(carriage return)(U+000D)이 올때까지 계속 됩니다. 여러 줄 주석은 /*으로 시작하고 */으로 끝납니다. 중첩하는 여러 줄 주석이 허용되지만, 주석표시는 균형에 맞게해야 합니다.

Markup formatting Reference에 설명된 것처럼, 주석은 추가 서식과 마크업(markup: 활자) 표시를 포함할 수 있습니다.

공백 문법(grammar of whitespace)
whitespace → whitespace-item whitespaceopt
whitespace-item → line-break
whitespace-item → comment
whitespace-item → multiline-comment
whitespace-item → U+0000, U+0009, U+000B, U+000C, 또는 U+0020

line-break → U+000A
line-break → U+000D
line-break → U+000A 다음에 U+000D

comment → // comment-text line-break
multiline-comment → /* multiline-comment-text */

comment-text → comment-text-item comment-textopt
comment-text-item → U+000A 또는 U+000D를 제외한 모든 유니코드 스칼라 값

multi-comment-text → multiline-comment-text-item multiline-comment-textopt
multi-comment-text-item → multiline-comment
multi-comment-text-item → comment-text-item
multi-comment-text-item → /* 또는 */를 제외한 모든 유니코드 스칼라 값

식별자(Identifiers)

식별자(identifiers)는 대문자나 소문자 A부터 Z까지, 밑줄(_), 기본 다국어 차원(Basic Multilingual Plane)에서 비조합 영어숫자 유니코드 문자나 개인 사용 영역(Private Use Area)에 없는 기본 다국어 차원(Basic Multilingual Plane) 외부의 문자로 시작합니다. 첫번째 문자 이후에, 숫자와 유니코드 문자 조합도 허용됩니다.

식별자처럼 예약된 단어로 사용하려면, 역따옴표(backtick)(`)을 앞과 뒤에 붙입니다. 예를 들어 class는 유효한 식별자가 아니지만, `class`는 유효합니다. 역따옴표(backticks)는 식별자의 일부로 간주되지 않습니다: `x`와 x는 같은 의미입니다.

명시적인 매개변수(parameter) 이름 없는 클로져 내부에서, 매개변수는 암시적으로 $0, $1, $2, 등등의 이름을 가집니다. 이러한 이름들은 클로져 범위 안에서 유효한 식별자 입니다.

식별자 문법(grammar of an identifier)
identifier → identifier-head identifier-charactersopt
identifier → ` identifier-head identifier-charactersopt `
identifier → implicit-parameter-name
identifier-list → identifier | identifieridentifier-list

identifier-head → 대문자 또는 소문자 문자 A에서 Z
identifier-head → _
identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA
identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF
identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF
identifier-head → U+1E00–U+1FFF
identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F
identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793
identifier-head → U+2C00–U+2DFF or U+2E80–U+2FFF
identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF
identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44
identifier-head → U+FE47–U+FFFD
identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD
identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD
identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD
identifier-head → U+D0000–U+DFFFD or U+E0000–U+EFFFD

identifier-character → 숫자 0에서 9
identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F
identifier-character → identifier-head
identifier-character → identifier-character identifier-charactersopt

implicit-parameter-name → $ decimal-digits

키워드와 구두점(Keywords and Punctuation)

다음에 오는 키워드들은 위의 identifiers에서 설명된 것처럼, 예약되어 있고 역따옴표(backticks)로 탈출(escapted)되지 않는 한, 식별자로 사용할 수 없습니다. input, var, let 이외의 키워드를 역따옴표(backticks)로 탈출되지(escaped)않고 함수 선언이나 함수 호출에서 매개변수 이름으로 사용할 수 있습니다. 멤버가 키워드와 같은 이름을 가질때, 멤업에 대한 참조는 역따옴표(backticks)로 탈출(escaped)될 필요가 없으며, 멤버에 대한 참조와 키워드 사용 간에 모호한 경우는 제외합니다 - 예를들어, self, Type, Protocol은 명시적인 멤버 표현식에서 특별한 의미를 가지므로, 문맥상(context) 역따옴표(backticks)로 탈출(escaped)되야만 합니다.

  • 키워드는 선언에서 사용됩니다: associatedtype, class, deinit, enum, extension, fileprivate, func, import, init, inout, internal, let, open, operator, private, protocol, public, static, struct, subscript, typealias, var.
  • 키워드는 문장에서 사용됩니다: break, case, continue, default, defer, do, else, fallthrough, for, guard, if, in, repeat, return, switch, where, while.
  • 키워드는 표현식과 타입에서 사용됩니다: Any, catch, false, is, nil, rethrows, super, self, Self, throw, throws, true, try.
  • 키워드는 패턴에서 사용됩니다: _.
  • 키워드는 숫자 기호로 시작합니다 (#): #available, #colorLiteral, #column, #else, #elseif, #endif, #error, #file, #fileLiteral, #function, #if, #imageLiteral, #line, #selector, #sourceLocation, #warning.
  • 키워드는 특정 문맥상(context) 예약되어 있습니다: associativity, convenience, dynamic, didSet, final, get, infix, indirect, lazy, left, mutating, none, nonmutating, optional, override, postfix, precedence, prefix, Protocol, required, right, set, Type, unowned, weak, willSet. 문법에서 나타난 문맥(context) 외부에서는 식별자로 사용될 수 있습니다.

다음에 오는 토큰은 구분점(punctuation)으로 예약되어 있고 사용자정의 연산자로 사용될 수 없습니다: (, ), {, }, [, ], ., ,, :, ;, =, @, #, & (접두사 연산자), ->, `, ?, ! (접미사 연산자).

리터럴(Literals)

리터럴(literal)은 숫자나 문자열처럼, 타입의 값의 소스코드 표현입니다.

다음은 리터럴 예제입니다.

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

리터럴은 자체 타입이 없으며, 리터럴은 무한한 정밀도로 분석되고 Swift의 타입 추론은 리터럴에 대한 타입 추론을 시도합니다. 예를들어, let x: Int8 = 42선언에서, Swift는 명시적인 타입 주석 (: Int8)을 사용해서 정수 리터럴 42가 Int8 타입 임을 추론합니다. 적합한 타입 정보가 없는 경우에, Swift는 리터럴의 타입이 Swift 표준 라이브러리에 정의되어 있는 기본 리터럴 타입 중에 하나임을 추론합니다. 정수형 리터럴에 대한 기본 타입은 Int이며, 부동 소수점(floating-point) 리터럴에 대해서는 Double이며, 문자열 리터럴에 대해서는 String이고 Boolean 리터럴에 대해서는 Bool입니다. 예를 들어, let str = "Hello, world"선언에서, 문자열 리터럴 "Hello, world"의 타입은 String으로 추론됩니다.

리터럴 값에 대한 타입 주석(annotation)을 지정할때, 주석(annotation)의 타입은 반드시 리터럴 값으로부터 인스턴스화할 수 있는 타입이어야 합니다. 즉, 타입은 반드시 다음에오는 Swift 표준 라이브러리 프로토콜 중 하나를 준수해야 합니다: 정수형 리터럴에 대해서 ExpressibleByIntegerLiteral, 부동 소수점 리터럴에 대해서 ExpressibleByFloatLiteral, 문자열 리터럴에 대해서 ExpressibleByStringLiteral, Boolean 리터럴에 대해서 ExpressibleByBooleanLiteral, 단일 유니코드 스칼라만 포함하는 문자열 리터럴에 대해서 ExpressibleByUnicodeScalarLiteral, 단일 확장된 문자소 클러스만 포함하는 문자열 리터럴에 대해서 ExpressibleByExtendedGraphemeClusterLiteral. 예를들어, Int8은 ExpressibleByIntegerLiteral 프로토콜을 준수하고, 따라서 let x: Int8 = 42 선언에서 정수형 리터럴 42에 대해서 타입 주석에 사용될 수 있습니다.

리터럴 문법(grammar of a literal)
literal → numeric-literal | string-literal | boolean-literal | nil-literal

numeric-literal → -opt integer-literal | -opt flating-point-literal
boolean-literal → true | false
nil-literal → nil

정수형 리터럴(Integer Literals)

정수형 리터럴(Integer literals)은 불특정(unspecified) 정밀도(precision)의 정수형 값을 표현합니다. 기본적으로, 정수형 리터럴은 10진수(dicimal)로 표현됩니다: 접두사를 사용해서 기본을 교체해서 지정할 수 있습니다. 2진수 리터럴은 0b로 시작하며, 8진수 리터럴은 0o로 시작하고, 16진수 리터럴은 0x로 시작합니다.

10진수 리터럴은 숫자 0에서 9까지를 포함합니다. 2진수 리터럴은 0과 1을 포함하고, 8진수 리터럴은 0에서 7까지를 포함하며, 16진수 리터럴은 0에서 9까지 뿐만 아니라 대문자 또는 소문자 A에서 F까지를 포함합니다.

음의 정수 리터럴은 -42처럼, 정수 리터럴에 빼기 기호(-)`를 앞에 붙여서 표현됩니다.

밑줄(_)은 가독성을 위해서 숫자 사이에 허용되지만, 무시되고 리터럴의 값에는 영향을 주지 않습니다. 정수형 리터럴은 0으로 시작할 수 있지만, 마찬가지로 무시되고 리터럴의 값에 영향을 주지 않습니다.

별도의 규정이 없으면, 기본적으로 정수형 리터럴의 타입은 Swift 표준 라이브러리 Int타입으로 추론 됩니다. 또한 Swift 표준 라이브러리는 Integers에 설명된것 처럼, 다양한 크기의 부호있는 정수와 부호없는 정수의 타입을 정의합니다.

정수형 리터럴의 문법(grammar of an integer literal)
integer-literal → binary-literal
integer-literal → octal-literal
integer-literal → decimal-literal
integer-literal → hexadecimal-literal

binary-literal → 0b binary-digit binary-literal-charactersopt
binary-digit → 숫자 0 또는 1
binary-literal-character → binary-digit | _
binary-literal-characters → binary-literal-character binary-literal-charactersopt

octal-literal → 0o octal-digit octal-literal-charactersopt
octal-digit → 숫자 0에서 7까지
octal-literal-character → octal-digit | _
octal-literal-characters → octal-literal-character octal-literal-charactersopt

decimal-literal → decimal-digit decimal-literal-charactersopt
decimal-digit → 숫자 0에서 9까지
decimal-digits → decimal-digit decimal-digitsopt
decimal-literal-character → decimal-digit | _
decimal-literal-characters → decimal-literal-character decimal-literal-charactersopt

hexadecimal-literal → 0x hexadecimal-digit hexadecimal-literal-charactersopt
hexadecimal-digit → 숫자 0에서 9까지, a에서 f까지, A에서 F까지
hexadecimal-literal-character → hexadecimal-digit | _
hexadecimal-literal-characters → hexadecimal-literal-character hexadecimal-literal-charactersopt

부동소수점 리터럴(Floating-Point Literals)

부동소수점 리터럴(floating-point literals)은 불특정 정밀도의 부동소수점 값을 표현합니다.

기본적으로, 부동소수점 리터럴(floating-point literals)은 10진수(접두사 없음)로 표현되지만, 또한 16진수(접두사 0x)로 표현될 수 있습니다.

10진수 부동소수점 리터럴은 10진수 숫자의 순서와 10진수의 소수점(fraction), 10진수 지수(exponent), 또는 둘다로 구성되어 있습니다. 10진수 소수점(fraction)은 소수점(.) 다음에 10진수 숫자들로 구성되어 있습니다. 지수(exponent)는 대문자 또는 소문자 e 접두사로 구성되며, 그 뒤에 10의 제곱(power)을 나타내는 10진수 숫자의 순서로 e앞에 있는 값을 곱합니다. 예를들어, 1.25e2는 1.25 x 102이며, 125.0으로 평가합니다. 비슷하게, 1.25e-2는 1.25 x 10-2*이며, 0.0125로 평가합니다.

16진수 부동소수점 리터럴은 0x 접두사로 구성되며, 그 뒤에 옵셔널 16진수 소수점(fraction), 그 뒤에 16진수 지수(exponent)가 옵니다. 16진수 소수점(fraction)은 소수점(dicimal point) 뒤에 16진수 숫자의 순서로 구성되어 있습니다. 지수는 대문자나 소문자 p 접두사로 구성되며, 그 뒤에 p 앞에 있는 값에 2의 제곱을 곱한것을 나타내는 10진수 숫자가 옵니다. 예를들어, 0xFp2는 15 x 22를 나타내고, 60으로 평가합니다. 비슷하게, 0xFp-2는 15 x 2-2를 나타내고 3.75로 평가합니다.

음수 부동소수점 리터럴은 -42.5 처럼, 부동소수점 리터럴에 빼기 기호(-)`를 앞에 붙여서 표현됩니다.

밑줄(_)은 가독성을 위해서 숫자 사이에 허용되지만, 무시되고 리터럴의 값에는 영향을 주지 않습니다. 부동소수점 리터럴은 0으로 시작할 수 있지만, 마찬가지로 무시되고 리터럴의 값에 영향을 주지 않습니다.

별도의 규정이 없으면, 기본적으로 부동소수점 리터럴의 타입은 64비트 부동소수점 숫자를 표현하는 Swift 표준 라이브러리 Double타입으로 추론 됩니다. 또한 Swift 표준 라이브러리는 32비트 부동소수점 숫자를 표현하는 Float 타입을 정의합니다.

부동소수점 리터럴 문법(grammar of floating-point literal)
floating-point-literal → decimal-literal decimal-fractionopt decimal-exponentopt
floating-point-literal → hexadecimal-literal hexadecimal-fractionopt hexadecimal-exponent

decimal-fraction → . decimal-literal
decimal-exponent → floating-point-e signopt decimal-literal

hexadecimal-fraction → . hexadecimal-digit hexadecimal-literal-charactersopt
hexadecimal-fraction → floating-point-p signopt decimal-literal

floating-point-e → e | E
floating-point-p → p | P
sign → + | -

문자열 리터럴(String Literals)

문자열 리터럴은 쌍따옴표로 둘러싸인 문자들의 순서입니다. 한줄 문자열 리터럴은 쌍따옴표로 둘러싸여 있고 다음과 같은 형식입니다:

"characters"

문자열 리터럴는 탈출되지 않는(unescaped) 쌍따옴표("), 탈출되지 않는(unescaped) 백슬러쉬(\), 캐리지 리턴(carriage return) 또는 줄 바꿈(line feed)를 포함할 수 없습니다.

여러줄(multiline) 문자열 리터럴은 3개의 쌍따옴표로 둘러싸여있고 다음과 같은 형식입니다.

"""
characters
"""

한줄 문자열 리터럴과 다르게, 여러줄 문자열 리터럴은 탈출되지 않는(unescaped) 쌍따옴표("), 탈출되지 않는(unescaped) 백슬러쉬(\), 캐리지 리턴(carriage return) 또는 줄 바꿈(line feed)를 포함할 수 있습니다. 3개가 나란히 있는 탈출되지 않는(unescaped) 쌍따옴표는 포함할 수 없습니다.

여러줄 문자열 리터럴을 시작하는 """ 뒤에 오는 행 바꿈(line break)은 문자열의 일부가 아닙니다. 리터럴을 끝내는 """ 앞에 오는 행 바꿈(line break)도 문자열의 일부가 아닙니다. 줄 바꿈(line feed)로 시작하거나 끝나는 여러줄 문자열 리터럴을 만들기 위해 첫번째 줄이나 마지막 줄에 빈 줄을 작성합니다.

여러줄 문자열 리터럴은 공백과 탭의 조합을 사용해서 들여쓰기(indented)가 가능합니다; 이 들여쓰기는 문자열에 포함되지 않습니다. 리터럴을 끝내는 """는 들여쓰기를 결정합니다. 리터럴에서의 공백이 없는 줄은 항상 닫는 """ 앞에 동일한 들여쓰기로 시작해야 합니다; 탭과 공백 사이에는 변환이 없습니다. 들여쓰기 뒤에 추가적으로 공백이나 탭을 포함할 수 있습니다; 이러한 공백이나 탭은 문자열에서 나타납니다.

여러줄 문자열 리터럴에서 행 바꿈(line breaks)은 줄 바꿈 문자를 사용하도록 표준화되어 있습니다. 심지어는 소스파일에 캐리지 리턴(carriage return)과 줄 바꿈(line feed)가 혼합된 경우에, 문자열에서 모두 행 바꿈(line break)과 동일하게 될 것입니다.

여러줄 문자열 리터럴에서, 줄의 끝에서 문자열의 행 바꿈(line break)를 생략하기 위해 백슬러시(\)를 작성합니다. 백슬러시와 행 바꿈(line break)간의 모든 공백(whitespace)도 생량됩니다. 이 문법을 사용해서 결과 문자열의 값을 변경하지 않고 소스 코드에서 여러줄 문자열 리터럴을 hard wrap(문자열에 실제 줄바꿈을 삽입시킴)할 수 있습니다.

다음과 같은 탈출 순서(sequences)를 사용해서, 특정 문자들은 한줄 또는 여러줄 형식의 문자열 리터럴에 포함될 수 있습니다.

  • 널 문자 (\0)
  • 백슬러시 (\\)
  • 수평 탭 (\t)
  • 줄 바꿈 (\n)
  • 캐리지 리턴 (\r)
  • 쌍 따옴표 (\")
  • 작은 따옴표 (\')
  • 유니코드 스칼라 (\u{n}), n은 1에서 8까지 숫자가 있는 16진수입니다.

표현식의 값은 문자열 리터럴에 백슬래쉬(\) 뒤에 괄호(())로 표현식을 감싸서 삽입될 수 있습니다. 끼워넣기(interpolated) 표현식은 문자열 리터럴을 포함할수 있지만, 탈출되지 않은(unescaped) 백슬러쉬(\), 캐리지 리턴(carriage return), 줄 바꿈(line feed)를 포함할 수는 없습니다.

예를들어, 다음 문자열 리터럴은 모두 같은 값을 가집니다.

"1 2 3"
"1 2 \("3")"
"1 2 \(3)"
"1 2 \(1 + 2)"
let x = 3; "1 2 \(x)"

문자열 리터럴의 기본 추론 타입은 String입니다. String 타입에 대한 자세한 정보는, Strings and Characters과 String를 보세요.

문자열 리터럴은 +연선자로 연결되고 컴파일시에 연결됩니다. 예를 들어, 아래 예제에 있는 textA와 textB의 값은 동일합니다 - 실시간으로 연결이 수행되지 않습니다.

let textA = "Hello " + "world"
let textB = "Hello world"

문자열 리터럴의 문법(grammar of string literal)
string-literal → static-string-literal | interpolated-string-literal

static-string-literal → " quoted-textopt "
static-string-literal → """ multiline-quoted-textopt """

quoted-text → quoted-text-item quoted-textopt
quoted-text-item → escaped-character
quoted-text-item → "\, U+000A, U+000D 를 제외한 모든 유니코드 스칼라 값

multiline-quoted-text → multiline-quoted-text-item multiline-quoted-textopt
multiline-quoted-text-item → escaped-character
multiline-quoted-text-item → \를 제외한 모든 유니코드 스칼라 값
multiline-quoted-text-item → escaped-newline

interpolated-string-literal → " interpolated-textopt "
interpolated-string-literal → """ multiline-interpolated-textopt """

interpolated-text → interpolated-text-item interpolated-textopt 
interpolated-text-item → \( expression ) | quoted-text-item

multiline-interpolated-text → multiline-interpolated-text-item multiline-interpolated-textopt
multiline-interpolated-text-item → \( expression ) | multiline-quoted-text-item

escaped-character → \0 | \\ | \t | \n | \r | \" | \'
escaped-character → \u { unicode-scalar-digits } 
unicode-scalar-digits → 1에서 8까지 16진수

escaped-newline → \ whitespaceopt line-break

연산자(Operators)

Swift 표준 라이브러리는 사용하기 위한 다양한 연산자를 정의하며, 그중 대다수는 Basic Operators와 Advanced Operators에서 논의됩니다. 현재 섹션(section)에서 사용자정의 연산자를 정의하기 위해 사용될수 있는 문자들을 설명합니다.

사용자정의 연산자는 ASCII 문자들 /, =, -, +, !, *, %, <, >, &, |, ^, ?, ~, 또는 아래 문법에서 정의된 유니코드 문자들(수학적인 연산자(Mathematical Operators), 기타 기호(Miscellaneous Symbols), 돌연변이(Dingbats) 유니코드 블록의 문자들을 포함) 중 하나로 시작할 수 있씁니다. 첫번째 문자 이후에는, 유니코드 문자 조합도 허용됩니다.

또한 점(.)으로 시작하는 사용자정의 연산자를 정의할 수도 있습니다. 이러한 연산자들은 추가적으로 점(dot)을 포함할 수 있습니다. 예를 들어, .+.는 단일 연산자로 처리됩니다. 연산자가 점으로 시작되지 않는 경우, 다른 곳에 점을 포함할 수 없습니다. 예를 들어, +.+는 +연산자 다음에 .+ 연산자로 처리됩니다.

비록 물음표(?)가 포함된 사용자정의 연산자를 정의할 수 있지만, 하나의 물음표 문자로만으로 구성될 수는 없습니다. 또한, 연산자에 느낌표(!)를 포함할 수 있지만, 후위(postfix) 연산자는 물음표(?)나 느낌표(!)로 시작할 수 없습니다.

주의
=, ->, //, /*, */, ., 전위 연산자 <, &, ?, 중위 연산자 ?, 후위 연산자 >, !, ? 토큰은 예약되어 있습니다. 이러한 토큰은 오버로드(overloaded)될 수 없으며, 사용자정의 연산자로도 사용할 수 없습니다.

연산자 주변의 공백(whitespace)는 연산자가 전위(prefix) 연산자, 후위(postfix) 연산자, 또는 이진(binary) 연산자인지 결정하기 위해 사용됩니다. 이 동작은 다음에 오는 규칙으로 요약되어 있습니다.

  • 연산자가 양쪽에 공백(whitespace)이 있거나 어디에도 없는 경우에, 이진(binary) 연산자로 처리됩니다. 예제로써, a+++b와 a +++ b에 있는 +++연산자는 이진 연산자로 처리됩니다.
  • 연산자가 왼쪽에만 공백(whitespace)가 있는 경우에, 단항 전위(prefix unary) 연산자로 처리됩니다. 예제로, a +++b에 있는 +++ 연산자는 단항 전위(prefix unary) 연산자로 처리됩니다.
  • 연산자가 오른쪽에만 공백(whitespace)가 있는 경우에, 단항 후위(postfix unary) 연산자로 처리됩니다. 예제로, a+++ b에 있는 +++ 연산자는 단항 후위(postfix unary) 연산자로 처리됩니다.
  • 연산자가 왼쪽에 공백(whitespace)이 없지만, 바로 뒤에 점(.)이 오는 경우에, 단항 후위(postfix unary) 연산자로 처리됩니다. 예제로, a+++.b에 있는 +++ 연산자는 단항 후위(postfix unary) 연산자(a +++ b 보다는 a+++ .b)로 처리됩니다

이러한 규칙의 목적상, 연산자 앞의 ([{ 문자들, 연산자 뒤의 )]}, 그리고 ,;: 문자들은 공백(whitespace)으로 간주됩니다.

위의 규칙들에서 한가지 주의사항(caveat)이 있습니다. 미리 정의된 연산자 ! 또는 ? 왼쪽에 공백(whitespace)이 없는 경우에, 오른쪽에 공백이 있는지와 상관없이 후위(postfix) 연산자로 처리됩니다. 옵셔널 체이닝 연산자로 ? 를 사용하기 위해서는 왼쪽에 공백(whitespace)이 있어서는 안됩니다. 이를 3항 조건 연산자(? :)에서 사용하기 위해서는 양쪽에 공백(whitespace)이 있어야만 합니다.

특정 구성에서, 앞쪽에 < 또는 >를 가진 연산자들은 2 이상의 토큰으로 분할할 수도 있습니다. 나머지는 같은 방법으로 처리되고 다시 나눌수도 있습니다. 결과적으로, Dictionary<String, Array<Int>>와 같은 구성에서 닫는 > 문자 사이간에 구분(disambiguate)하기 위해서 공백(whitespace)을 사용할 필요가 없습니다. 이 예제에서, 닫는 > 문자는 비트(bit) 시프트(shift) >> 연산자로 잘못 해석될 수 있는 단일 토큰으로 취급되지 않습니다.

새로운 사용자정의 연산자를 정의하는 방법을 배우기 위해서, Custom Operators와 Operator Declaration를 보세요.

연산자 문법(grammar of operators)
operator → operator-head operator-charactersopt
operator → dot-operator-head dot-operator-characters

operator-head → / | = | - | + | ! | * | % | < | > | & | | | ^ | ~ | ?
operator-head → U+00A1–U+00A7
operator-head → U+00A9 또는 U+00AB
operator-head → U+00AC 또는 U+00AE
operator-head → U+00B0–U+00B1
operator-head → U+00B6, U+00BB, U+00BF, U+00D7, or U+00F7
operator-head → U+2016–U+2017
operator-head → U+2020–U+2027
operator-head → U+2030–U+203E
operator-head → U+2041–U+2053
operator-head → U+2055–U+205E
operator-head → U+2190–U+23FF
operator-head → U+2500–U+2775
operator-head → U+2794–U+2BFF
operator-head → U+2E00–U+2E7F
operator-head → U+3001–U+3003
operator-head → U+3008–U+3020
operator-head → U+3030

operator-character → operator-head
operator-character → U+0300–U+036F
operator-character → U+1DC0–U+1DFF
operator-character → U+20D0–U+20FF
operator-character → U+FE00–U+FE0F
operator-character → U+FE20–U+FE2F
operator-character → U+E0100–U+E01EF
operator-character → operator-character operator-charactersopt

dot-operator-head → .
dot-operator-character → . | operator-character
dot-operator-characters → dot-operator-character dot-operator-charactersopt

binary-operator → operator
prefix-operator → operator
postfix-operator → operator


'Swift > Language Reference' 카테고리의 다른 글

타입(Types)  (0) 2019.03.11
어휘 구조(Lexical Structure)  (0) 2019.03.08
언어 참조 정보(About the Language Reference)  (0) 2019.03.06
Posted by 까칠코더