GRAMMAR OF AN EXPRESSION expression → try-operatorawait-operatorprefix-expression binary-expressionsexpression-list → expression | expression,
expression-list
GRAMMAR OF A PREFIX EXPRESSION prefix-expression → prefix-operatorpostfix-expression prefix-expression → in-out-expression
try
연산자 다음에 표현식으로 구성됩니다. 형식은 다음과 같습니다:try?
연산자 다음에 표현식으로 구성됩니다. 형식은 다음과 같습니다:nil
입니다.try!
연산자 다음에 표현식으로 구성됩니다. 형식은 다음과 같습니다:try
, try?
, 또는 try!
로 표시되면 해당 연산자는 중위 표현식 전체에 적용됩니다. 즉, 괄호를 사용하여 명시적으로 연산자의 적용 범위를 명시할 수 있습니다.try
표현식이 괄호로 묶여있지 않으면 try
표현식은 중위 연산자의 오른쪽에 나타날 수 없습니다.GRAMMAR OF A TRY EXPRESSION try-operator →try
|try
?
|try
!
await
연산자 다음에 비동기 동작의 결과를 사용하는 표현식으로 구성됩니다. 형식은 다음과 같습니다:await
표현식의 값은 표현식 (expression) 의 값입니다.await
로 표시된 표현식을 잠재적 중단 지점 (potential suspension point) 이라 합니다. 비동기 함수의 실행은 await
로 표시된 각 표현식에서 일시 중단될 수 있습니다. 또한 동시 코드의 실행은 다른 시점에서 중단되지 않습니다. 이는 잠재적 중단 지점 사이의 코드가 다음 잠재적 중단 지점 이전에 업데이트를 완료하는 경우 일시적으로 중단을 깨야하는 상태를 안전하게 업데이트 할 수 있음을 의미합니다.await
표현식은 async(priority:operation:)
함수에 전달된 후행 클로저와 같은 비동기 컨텍스트 내에서만 나타날 수 있습니다. defer
구문의 바디나 동기 함수 타입의 자동 클로저 (autoclosure) 내에서는 나타날 수 없습니다.await
연산자로 표시되면 해당 연산자는 전체 중위 표현식에 적용됩니다. 즉, 괄호를 사용하여 연산자의 적용 범위를 명시할 수 있습니다.await
표현식은 중위 연산자가 할당 연산자 이거나 await
표현식이 괄호로 묶인 경우가 아니면 중위 연산자의 우항에 나타날 수 없습니다.await
와 try
연산자가 모두 포함되면 try
연산자가 먼저 나타나야 합니다.GRAMMAR OF AN AWAIT EXPRESSION await-operator →await
NOTE 구문 분석 시 중위 연산자로 구성된 표현식은 단순 목록으로 표현됩니다. 이 목록은 연산자 우선순위를 적용하여 트리로 변환됩니다. 예를 들어 표현식2 + 3 * 5
는 처음에는 5개의 항목2
,+
,3
,*
, 그리고5
의 단순 목록으로 이해됩니다. 이 프로세스는 트리 (2 + (3 * 5)) 로 변환합니다.GRAMMAR OF A INFIX EXPRESSION infix-expression → infix-operator prefix-expression infix-expression → assignment-operator try-operatorprefix-expression infix-expression → conditional-operator try-operatorprefix-expression infix-expression → type-casting-operator infix-expressions → infix-expression infix-expressions
GRAMMAR OF AN ASSIGNMENT OPERATOR assignment-operator →=
true
이면 조건부 연산자는 첫번째 표현식을 평가하고 해당 값을 반환합니다. 그렇지 않으면 두번째 표현식을 평가하고 그것의 값을 반환합니다. 사용하지 않은 표현식은 평가되지 않습니다.is
연산자, as
연산자, as?
연산자, 그리고 as!
연산자 인 4개의 타입 캐스팅 연산자 (type-casting operators) 가 있습니다.is
연산자는 표현식 이 지정된 타입 으로 캐스팅 될 수 있는지 런타임 시에 확인합니다. 표현식 이 지정된 타입 으로 캐스팅 될 수 있으면 true
를 반환하고 그렇지 않으면 false
를 반환합니다.as
연산자는 업캐스팅 (upcasting) 또는 브릿징 (bridging) 과 같이 캐스트가 항상 성공하는 것으로 컴파일 시 알려진 경우에 캐스팅을 수행합니다. 업캐스팅 (Upcasting) 을 사용하면 중간 변수를 사용하지 않고 표현식을 해당 타입의 상위 타입 인스턴스로 사용할 수 있습니다. 다음 접근은 동일합니다:NSString
과 같은 해당 Foundation 타입으로 String
과 같은 Swift 표준 라이브러리 타입의 표현식으로 사용할 수 있습니다. 브릿징에 대한 자세한 설명은 Foundation 타입 동작 (Working with Foundation Types) 를 참고 바랍니다.as?
연산자는 지정한 타입 으로 표현식 의 조건부 캐스팅을 수행합니다. as?
연산자는 지정한 타입 의 옵셔널로 반환합니다. 런타임에 캐스팅이 성공하면 표현식 의 값은 옵셔널로 래핑되고 반환됩니다; 그렇지 않으면 반환된 값은 nil
입니다. 지정된 타입 으로 캐스팅이 실패하거나 성공이 보장되면 컴파일 시 에러가 발생합니다.as!
연산자는 지정한 타입 으로 표현식 의 강제 캐스팅을 수행합니다. as!
연산자는 옵셔널 타입이 아닌 지정한 타입 의 값을 반환합니다. 캐스팅이 실패하면 런타임 에러가 발생합니다. x as! T
의 동작은 (x as? T)!
의 동작과 동일합니다.GRAMMAR OF A PRIMARY EXPRESSION primary-expression → identifier generic-argument-clauseprimary-expression → literal-expression primary-expression → self-expression primary-expression → superclass-expression primary-expression → closure-expression primary-expression → parenthesized-expression primary-expression → tuple-expression primary-expression → implicit-member-expression primary-expression → wildcard-expression primary-expression → key-path-expression primary-expression → selector-expression primary-expression → key-path-string-expression
#file
String
#fileID
String
#filePath
String
#line
Int
#column
Int
#function
String
#dsohandle
UnsafeRawPointer
#file
의 문자열 값은 이전 #filePath
동작에서 새로운 #fileID
동작으로 변경 가능하도록 언어 버전에 따라 다릅니다. 현재 #file
은 #filePath
와 동일한 값을 가집니다. Swift 의 향후 버전에서는 #file
은 #fileID
와 동일한 값을 가질 것입니다. 향후 동작을 채택하려면 #file
을 #fileID
또는 #filePath
로 적절하게 바꾸십시오.#fileID
표현식의 문자열 값은 모듈 (module)/파일 (file) 의 형식을 가지며 파일 (file) 은 표현식이 나타내는 파일의 이름이고 모듈 (module) 은 이 파일이 속한 모듈의 이름을 나타냅니다. #filePath
표현식의 문자열 값은 표현식이 나타내는 파일의 전체 파일시스템 경로입니다. 이 두 값은 라인 제어 구문 (Line Control Statement) 에서 설명한대로 #sourceLocation
에 의해 변경될 수 있습니다. #fileID 는 #filePath 와 달리 소스 파일의 전체 경로를 포함하지 않으므로 개인정보보호를 강화하고 컴파일 된 바이너리의 크기를 더 줄입니다. 테스트, 빌드 스크립트, 또는 다른 프로그램의 일부가 되는 코드에 #filePath
사용은 피해야 합니다.NOTE#fileID
표현식을 분석하려면 모듈 이름을 첫 번째 슬래시 (/
) 앞의 텍스트로 읽고 파일 이름을 마지막 슬래시 이후 문자열로 읽습니다. 문자열은MyModule/some/disambiguation/MyFile.swift
와 같이 여러개의 슬래시가 포함될 수 있습니다.
#function
의 값은 해당 함수의 이름이고 메서드 내에서 해당 메서드의 이름이고 프로퍼티 getter 또는 setter 내에서 해당 프로퍼티의 이름이고 init
또는 subscript
와 같은 툭수 멤버 내에서 해당 키워드의 이름이고 파일의 최상위 수준에서는 현재 모듈의 이름입니다.T
는 표현식 내의 타입인 타입 [T]
를 가집니다. 여러 타입의 표현식이 있는 경우 T
는 가장 가까운 공통 상위 타입 (supertype) 입니다. 빈 배열 리터럴은 빈 대괄호 쌍을 사용하여 작성하고 지정된 타입의 빈 배열을 생성하는데 사용될 수 있습니다.Key
는 키 표현식의 타입이고 Value
는 값 표현식의 타입인 타입 [Key: Value]
를 가집니다. 여러 타입의 표현식이 있는 경우 Key
와 Value
는 해당 값에 대해 가장 가까운 공통 상위 타입입니다. 빈 딕셔너리 리터럴은 빈 배열 리터럴과 구분하기 위해 대괄호 쌍내에 콜론 ([:]
) 을 작성합니다. 지정한 키와 값 타입으로 빈 딕셔너리 리터럴을 생성하기 위해 빈 딕셔너리 리터럴을 사용할 수 있습니다.GRAMMAR OF A LITERAL EXPRESSION literal-expression → literal literal-expression → array-literal | dictionary-literal | playground-literal literal-expression →#file
|#fileID
|#filePath
literal-expression →#line
|#column
|#function
|#dsohandle
array-literal →[
array-literal-items]
array-literal-items → array-literal-item,
| array-literal-item,
array-literal-items array-literal-item → expression dictionary-literal →[
dictionary-literal-items]
|[
:
]
dictionary-literal-items → dictionary-literal-item,
| dictionary-literal-item,
dictionary-literal-items dictionary-literal-item → expression:
expression playground-literal →#colorLiteral
(
red
:
expression,
green
:
expression,
blue
:
expression,
alpha
:
expression)
playground-literal →#fileLiteral
(
resourceName
:
expression)
playground-literal →#imageLiteral
(
resourceName
:
expression)
self
표현식은 현재 타입 또는 해당 타입의 인스턴스에 대한 명시적 참조입니다. 형식은 다음과 같습니다:self
는 해당 타입의 현재 인스턴스를 참조합니다. 타입 메서드에서 self
는 현재 타입을 참조합니다.self
표현식은 멤버에 접근할 때 범위를 지정하는데 사용되고 함수 파라미터와 같이 범위에 같은 이름의 다른 변수가 있을 때 명확성을 제공합니다. 예를 들어:self
에 할당할 수 있습니다. 예를 들어:GRAMMAR OF A SELF EXPRESSION self-expression →self
| self-method-expression | self-subscript-expression | self-initializer-expression self-method-expression →self
.
identifier self-subscript-expression →self
[
function-call-argument-list]
self-initializer-expression →self
.
init
GRAMMAR OF A SUPERCLASS EXPRESSION superclass-expression → superclass-method-expression | superclass-subscript-expression | superclass-initializer-expression superclass-method-expression →super
.
identifier superclass-subscript-expression →super
[
function-call-argument-list]
superclass-initializer-expression →super
.
init
throws
또는 async
작성하는 것은 클로저를 throwing 또는 비동기를 나타냅니다.await
표현식이 포함되어 있다면 그것은 비동기로 이해됩니다.in
키워드도 생략합니다. 생략한 타입을 유추할 수 없을 때 컴파일 시 에러가 발생합니다.$
다음에 위치가 붙어 이름이 붙여집니다: $0
, $1
, $2
, 등.myFunction
에 전달된 클로저 표현식은 이러한 종류의 즉각적인 사용의 예제입니다. 결과적으로 클로저 표현식은 이스케이프 (escaping) 인지 비이스케이프 (nonescaping) 인지 여부는 주변의 컨텍스트에 의해 결정됩니다. 클로저 표현식은 즉시 호출되거나 비이스케이프 함수 인수로 전달되면 비이스케이프 입니다. 그렇지 않으면 클로저 표현식은 이스케이프 입니다.in
키워드를 사용해야 합니다.a
는 캡처 목록에 포함되지만 b
는 포함되지 않으므로 다른 동작을 보여줍니다.a
라는 이름으로 두가지가 있지만 b
는 변수로 하나만 존재합니다. 내부 범위의 a
는 클로저가 생성될 때 외부 범위에서 a
의 값으로 초기화 되지만 해당 값은 특별한 방법으로 연결되지 않습니다. 이것은 외부 범위의 a
의 값이 변경되더라도 내부 범위의 a
의 값은 영향을 받지 않고 클로저 내에 a
가 변경되도 클로저 외부의 a
의 값은 영향을 받지 않습니다. 반대로 외부 범위에 b
는 하나의 변수로만 있으므로 클로저 내부 또는 외부에서 변경되면 두 위치 모두에 반영됩니다.x
라는 이름의 두가지가 있는데 외부 범위의 변수와 내부 범위의 상수이지만 둘다 참조 의미이기 때문에 동일한 객체를 참조합니다.weak
또는 unowned
로 캡처 목록에 표현식을 표시할 수 있습니다.GRAMMAR OF A CLOSURE EXPRESSION closure-expression →{
attributesclosure-signaturestatements}
closure-signature → capture-list opt closure-parameter-clausethrows
function-resultin
closure-signature → capture-listin
closure-parameter-clause →(
)
|(
closure-parameter-list)
| identifier-list closure-parameter-list → closure-parameter | closure-parameter,
closure-parameter-list closure-parameter → closure-parameter-name type-annotationclosure-parameter → closure-parameter-name type-annotation...
closure-parameter-name → identifier capture-list →[
capture-list-items]
capture-list-items → capture-list-item | capture-list-item,
capture-list-items capture-list-item → capture-specifieridentifier capture-list-item → capture-specifieridentifier=
expression capture-list-item → capture-specifierself-expression capture-specifier →weak
|unowned
|unowned(safe)
|unowned(unsafe)
x
의 타입은 컨텍스트가 암시하는 타입과 정확히 일치하고 y
의 타입은 SomeClass
에서 SomeClass?
로 변환 가능하며 z
의 타입은 SomeSubclass
에서 SomeClass
로 변환 가능합니다.GRAMMAR OF A IMPLICIT MEMBER EXPRESSION implicit-member-expression →.
identifier implicit-member-expression →.
identifier.
postfix-expression
(1)
의 타입은 단순히 Int
입니다.:
) 으로 구분된 식별자를 가질 수 있습니다. 형식은 다음과 같습니다:(a: 10, a: 20)
은 라벨 a
가 동일한 수준에서 두번 나타나므로 유효하지 않습니다. 그러나 (a: 10, b: (a: 1, x:2))
는 a
가 두번 나타나도 외부 튜플과 내부 튜플에서 나타나므로 유효합니다.NOTE 빈 튜플 표현식과 빈 튜플 타입 모두 Swift 에서()
로 작성됩니다.Void
는()
에 대한 타입 별칭이므로 빈 튜플 타입을 작성하기위해 사용할 수 있습니다. 그러나 모든 타입 별칭과 마찬가지로Void
는 항상 타입이므로 빈 튜플 표현식으로 작성하기 위해 사용할 수 없습니다.GRAMMAR OF A TUPLE EXPRESSION tuple-expression →(
)
|(
tuple-element,
tuple-element-list)
tuple-element-list → tuple-element | tuple-element,
tuple-element-list tuple-element → expression | identifier:
expression
x
에 할당되고 20 은 무시됩니다:GRAMMAR OF A WILDCARD EXPRESSION wildcard-expression →_
String
, [Int]
, 또는 Set<Int>
와 같은 모든 제너릭 파라미터를 포함한 구체적 타입의 이름입니다.subscript(keyPath:)
서브 스크립트에 키 경로를 전달해야 합니다. 예를 들어:\SomeClass.someProperty
대신에 \.someProperty
를 사용합니다:\.self
) 를 생성하기 위해 self
를 참조할 수 있습니다. 식별자 키 경로 (identity key path) 는 전체 인스턴스를 참조하므로 이를 사용하여 변수에 저장된 모든 데이터를 한번에 접근하고 변경할 수 있습니다. 예를 들어:OuterStructure
타입의 outer
프로퍼티의 someValue
프로퍼티를 접근하기 위해 키 경로 표현식 \OuterStructure.outer.someValue
을 사용합니다:Hashable
프로토콜을 준수하는 한 대괄호를 사용하여 서브 스크립트를 포함할 수 있습니다. 이 예제는 배열의 두번째 요소를 접근하기 위해 키 경로로 서브 스크립트를 사용합니다:index
를 사용하여 greetings
배역의 세번째 요소를 접근합니다. index
가 수정될 때 클로저는 새로운 인덱스를 사용하는 동안 키-경로 표현식은 여전히 세번째 요소를 참조합니다.SomeType
이고 타입 (SomeType) -> Value
의 함수 또는 클로저 대신에 타입 Value
의 값을 생성하는 키 경로 표현식을 사용할 수 있습니다.GRAMMAR OF A KEY-PATH EXPRESSION key-path-expression →\
type.
key-path-components key-path-components → key-path-component | key-path-component.
key-path-components key-path-component → identifier key-path-postfixes| key-path-postfixes key-path-postfixes → key-path-postfix key-path-postfixeskey-path-postfix →?
|!
|self
|[
function-call-argument-list]
Selector
타입의 인스턴스입니다. 예를 들어:as
연산자도 포함할 수 있습니다. 예를 들어:NOTE 메서드 이름 (method name) 과 프로퍼티 이름 (property name) 은 표현식이지만 절대 평가되지 않습니다.
GRAMMAR OF A SELECTOR EXPRESSION selector-expression →#selector
(
expression)
selector-expression →#selector
(
getter:
expression)
selector-expression →#selector
(
setter:
expression)
NOTE 프로퍼티 이름 (property name) 은 표현식이지만 절대 평가되지 않습니다.
GRAMMAR OF A POSTFIX EXPRESSION postfix-expression → primary-expression postfix-expression → postfix-expression postfix-operator postfix-expression → function-call-expression postfix-expression → initializer-expression postfix-expression → explicit-member-expression postfix-expression → postfix-self-expression postfix-expression → subscript-expression postfix-expression → forced-value-expression postfix-expression → optional-chaining-expression
:
) 으로 분리하여 인수값 전에 이름을 반드시 포함해야 합니다. 이러한 종류의 함수 호출 표현식 형식은 다음과 같습니다:(Bool) -> Int
와 같이 타입이 함수 타입인 파라미터@autoclosure () -> ((Bool) -> Int)
와 같이 래핑된 표현식의 타입이 함수 타입인 autoclosure 파라미터((Bool) -> Int)...
와 같이 배열 요소 타입이 함수 타입인 가변 파라미터Optional<(Bool) -> Int>
와 같이 타입이 하나 이상의 옵셔널 레이어에 래핑된 파라미터(Optional<(Bool) -> Int>)...
와 같이 타입이 이러한 허용된 타입을 결합하는 파라미터Optional
로 래핑됩니다.