MyClass
라는 사용자 정의 클래스의 인스턴스는 MyClass
타입을 가집니다. 사용자 정의 명명된 타입 외에도 Swift 표준 라이브러리는 배열, 딕셔너리, 그리고 옵셔널 값을 나타내는 타입을 포함하여 일반적으로 사용되는 명명된 타입을 정의합니다.(Int, (Int, Int))
는 첫번째는 명명된 타입인 Int
, 두번째는 다른 복합 타입 (Int, Int)
인 두개의 요소가 포함됩니다.(Int)
는 Int
와 같습니다.GRAMMAR OF A TYPE type → function-type type → array-type type → dictionary-type type → type-identifier type → tuple-type type → optional-type type → implicitly-unwrapped-optional-type type → protocol-composition-type type → opaque-type type → metatype-type type → any-type type → self-type type →(
type)
:
) 으로 시작하고 타입으로 끝납니다:someTuple
은 튜플 타입 (Double, Double)
을 갖도록 지정됩니다. 두번째 예제는 함수 someFunction
에 파라미터 a
는 타입 Int
를 갖도록 지정합니다.Int
는 명명된 타입 Int
를 직접 참조하는 타입 식별자이고 타입 식별자 Dictionary<String, Int>
는 명명된 타입 Dictionary<String, Int>
를 직접 참조합니다.Point
의 사용은 튜플 타입 (Int, Int)
를 나타냅니다..
) 구문을 사용합니다. 예를 들어 다음 코드의 타입 식별자는 ExampleModule
모듈에 선언된 명명된 타입 MyType
을 참조합니다.GRAMMAR OF A TYPE IDENTIFIER type-identifier → type-name generic-argument-clause opt | type-name generic-argument-clause opt.
type-identifier type-name → identifier
:
) 이 오는 식별자로 구성됩니다. 이러한 기능을 보여주는 예제는 여러개의 반환값이 있는 함수 (Functions with Multiple Return Values) 를 참고 바랍니다.()
에 대한 타입 별칭인 Void
를 제외하고 두 개 이상의 타입을 포함합니다.GRAMMAR OF A TUPLE TYPE tuple-type →(
)
|(
tuple-type-element,
tuple-type-element-list)
tuple-type-element-list → tuple-type-element | tuple-type-element,
tuple-type-element-list tuple-type-element → element-name type-annotation | type element-name → identifier
->
) 로 구분된 파라미터와 반환 타입으로 구성됩니다:() -> T
(여기서 T
는 모든 타입) 의 파라미터는 autoclosure
속성을 적용하여 호출 부분에서 암시적으로 클로저를 생성할 수 있습니다. 이것은 함수를 호출할 때 명시적으로 클로저를 작성할 필요없이 표현식의 평가를 연기하는 구문상 편리함을 제공합니다. 자동 클로저 함수 타입 파라미터의 예제는 자동 클로저 (Autoclosures) 를 참고 바랍니다.Int...
와 같이 기본 타입 이름과 바로 뒤에 점 3개 (...
) 로 구성됩니다. 가변 파라미터는 기본 타입 이름의 요소를 포함하는 배열로 처리됩니다. 예를 들어 가변 파라미터 Int...
는 [Int]
로 처리됩니다. 가변 파라미터를 사용하는 예제는 가변 파라미터 (Variadic Parameters) 를 참고 바랍니다.inout
키워드를 파라미터 타입 앞에 붙여야 합니다. inout
키워드로 가변 파라미터나 반환 타입으로 표시할 수 없습니다. In-out 파라미터는 In-Out 파라미터 (In-Out Parameters) 에 설명되어 있습니다.((Int, Int)) -> Void
는 튜플 타입 (Int, Int)
의 단일 파라미터를 가지고 값을 반환하지 않는 함수 타입입니다. 반대로 괄호가 없으면 (Int, Int) -> Void
는 두 개의 Int
파라미터를 가지고 값을 반환하지 않는 함수 타입입니다. 마찬가지로 Void
는 ()
에 대한 타입 별칭 이므로 함수 타입 (Void) -> Void
는 (()) -> ()
와 같습니다—빈 튜플인 단일 인수를 가지는 함수와 같습니다. 이 타입은 () -> ()
와 같지 않습니다—인수를 가지지 않는 함수입니다.->
) 를 포함하는 경우 함수 타입은 오른쪽에서 왼쪽으로 그룹화 됩니다. 예를 들어 함수 타입 (Int) -> (Int) -> Int
는 (Int) -> ((Int) -> Int)
로 이해됩니다—이 함수는 Int
를 가지며 Int
를 가지고 반환하는 다른 함수를 반환합니다.throws
키워드로 표시되어야 합니다. throws
키워드는 함수 타입의 일부분이며 던지지 않는 함수 (nonthrowing functions) 는 던지는 함수 (throwing functions) 의 하위 타입 (subtypes) 입니다. 결과적으로 던지는 함수로 같은 위치에서 던지지 않는 함수를 사용할 수 있습니다. 던지는 함수와 던지지 않는 함수는 던지는 함수와 메서드 (Throwing Functions and Methods) 와 다시 던지는 함수와 메서드 (Rethrowing Functions and Methods) 에 설명되어 있습니다.async
키워드로 표시되어야 합니다. async
키워드는 함수의 타입의 부분이며, 동기 함수는 비동기 함수의 하위 타입 (subtypes) 입니다. 결과적으로 비동기 함수와 같은 위치에서 동기 함수를 사용할 수 있습니다. 비동기 함수에 대한 더 자세한 설명은 비동기 함수와 메서드 (Asynchronous Functions and Methods) 를 참고 바랍니다.Any
의 프로퍼티, 변수, 또는 상수에 저장될 수 없습니다.takesTwoFunctions(first:second:)
에 대한 두 파라미터는 모두 함수입니다. 두 파라미터 모두 @escaping
으로 표시되지 않으므로 결과적으로 둘다 비이스케이프 입니다.first
와 second
파라미터는 비이스케이프 함수이므로 다른 비이스케이프 함수 파라미터 인수로 전달될 수 없습니다. 반대로 "OK" 로 표시된 2개의 함수 호출은 컴파일러 에러를 발생시키지 않습니다. 이 함수 호출은 external
이 takesTwoFunctions(first:second:)
의 파라미터 중 하나가 아니므로 제한사항에 위배되지 않습니다.withoutActuallyEscaping(_:do:)
함수를 이용하여 이스케이프 함수로 비이스케이프 함수 파라미터 중 하나를 임시로 변경해야 합니다. 메모리에 충돌 접근을 피하는 것에 대한 자세한 내용은 메모리 안정성 (Memory Safety) 를 참고 바랍니다.GRAMMAR OF A FUNCTION TYPE function-type → attributesfunction-type-argument-clauseasync
throws
->
type function-type-argument-clause →(
)
function-type-argument-clause →(
function-type-argument-list...
)
function-type-argument-list → function-type-argument | function-type-argument,
function-type-argument-list function-type-argument → attributesinout
type | argument-label type-annotation argument-label → identifier
Array<Element>
타입에 대해 다음과 같은 구문을 제공합니다:someArray[0]
는 "Alex"
인 인덱스 0번째 요소를 나타냅니다.array3D[0]
은 [[1, 2], [3, 4]]
를 참조하고 array3D[0][1]
은 [3, 4]
그리고 array3D[0][1][1]
은 값 4를 참조합니다.Dictionary<Key, Value>
타입에 대해 아래와 같은 구문을 제공합니다:someDictionary
는 키로 문자열과 값으로 정수를 가지는 딕셔너리가 선언됩니다.someDictionary["Alex"]
는 키 "Alex"
와 연관된 값을 참조합니다. 서브 스크립트는 딕셔너리의 값 타입의 옵셔널 값을 반환합니다. 지정한 키가 딕셔너리에 포함되지 않은 경우 서브 스크립트는 nil
을 반환합니다.Hashable
프로토콜을 준수해야 합니다.Optional<Wrapped>
에 대해 접미사 ?
구문을 정의합니다. 다른 표현으로 다음의 두 선언은 동일합니다:optionalInteger
는 옵셔널 정수의 타입을 가지도록 선언됩니다. 타입과 ?
사이에는 공백이 없을 수도 있습니다.Optional<Wrapped>
는 존재하거나 존재하지 않을 수 있는 값을 나타내는데 사용되는 none
과 some(Wrapped)
의 두가지 케이스가 있는 열거형입니다. 모든 타입은 명시적으로 선언되거나 옵셔널 타입으로 암시적으로 변환될 수 있습니다. 옵셔널 변수 또는 프로퍼티를 선언할 때 초기값을 제공하지 않으면 자동으로 nil
로 설정합니다.!
를 사용하여 값에 접근할 수 있습니다:nil
의 값을 가지는 옵셔널을 언래핑 하기위해 !
연산자를 사용하면 런타임 에러가 발생합니다.nil
인 경우에 작업은 더이상 수행되지 않으므로 런타임 에러가 발생하지 않습니다.Optional<Wrapped>
에 대한 접미사 !
구문을 정의합니다. nil
의 값을 가지는 옵셔널에 암시적 언래핑을 사용하려고 하면 런타임 에러가 발생합니다. 암시적 언래핑 동작을 제외하고 다음의 두 선언은 동일합니다:!
사이에 공백이 포함되지 않을 수 있습니다.nil
을 기본값으로 설정합니다.nil
이라면 더이상 작업이 수행되지 않으며 런타임 에러가 발생하지 않습니다.where
절을 지정할 때만 사용할 수 있습니다.ProtocolA
, ProtocolB
, 그리고 ProtocolC
를 상속하는 새로운 프로토콜을 선언하는 대신 프로토콜 구성 타입 ProtocolA & ProtocolB & ProtocolC
를 사용할 수 있습니다. 마찬가지로 SuperClass
의 하위 클래스와 ProtocolA
를 준수하는 새로운 프로토콜을 선언하는 대신에 SuperClass & ProtocolA
를 사용할 수 있습니다.PQR
의 정의는 P & Q & R
과 동일합니다.GRAMMAR OF A PROTOCOL COMPOSITION TYPE protocol-composition-type → type-identifier&
protocol-composition-continuation protocol-composition-continuation → type-identifier | protocol-composition-type
Any
입니다. 값은 나열된 프로토콜 또는 프로토콜 구성을 준수하는 타입의 인스턴스나 나열된 클래스를 상속하는 경우에만 불투명한 타입의 인스턴스로 사용될 수 있습니다. 불투명한 값과 상호작용하는 코드는 제약조건 (constraint) 에 의해 정의된 인터페이스의 일부의 방식으로만 값으로 사용할 수 있습니다.someFunction<T>()
는 타입 T
또는 Dictionary<String, T>
의 값을 반환할 수 있습니다..Type
을 붙입니다. 런타임 시 프로토콜을 준수하는 구체적인 타입이 아닌 프로토콜 타입의 메타타입은 프로토콜의 이름 다음에 .Protocol
을 붙입니다. 예를 들어 클래스 타입 SomeClass
의 메타타입은 SomeClass.Type
그리고 프로토콜 SomeProtocol
의 메타타입은 SomeProtocol.Protocol
입니다.self
표현식을 사용하여 타입을 값으로 접근할 수 있습니다. 예를 들어 SomeClass.self
는 SomeClass
의 인스턴스가 아닌 SomeClass
자체를 반환합니다. 그리고 SomeProtocol.self
는 런타임 시 SomeProtocol
을 준수하는 타입의 인스턴스가 아닌 SomeProtocol
자체를 반환합니다. 다음 예제와 같이 타입의 인스턴스와 함께 type(of:)
함수를 호출하여 해당 인스턴스의 동적으로 런타임 타입의 값으로 접근할 수 있습니다:required
키워드로 표시거나 final
키워드로 전체 클래스를 표시해야 합니다.Any
타입은 다른 모든 타입의 값을 포함할 수 있습니다. Any
는 다음 타입의 인스턴스에 대해 구체적인 타입으로 사용될 수 있습니다:Int.self
와 같은 메타타입Any
를 사용할 때 해당 프로퍼티 또는 메서드에 접근하려면 먼저 알려진 타입으로 인스턴스를 캐스팅 해야 합니다. Any
의 구체적인 타입인 인스턴스는 본래 동적 타입을 유지하고 as
, as?
, 또는 as!
와 같은 타입 캐스팅 연산자 (type-cast operators) 중 하나를 사용하여 타입을 캐스팅 할 수 있습니다. 예를 들어 as?
을 사용하여 배열의 첫번째 객체를 String
으로 조건부로 다운캐스트 합니다:AnyObject
프로토콜은 Any
타입과 유사합니다. 모든 클래스는 암시적으로 AnyObject
를 준수합니다. 언어에 의해 정의되는 Any
와 달리 AnyObject
는 Swift 표준 라이브러리에 의해 정의됩니다. 더 자세한 내용은 클래스 전용 프로토콜 (Class-Only Protocols) 와 AnyObject
를 참고 바랍니다.GRAMMAR OF AN ANY TYPE any-type →Any
Self
타입은 특정 타입이 아니라 해당 타입의 이름을 반복하거나 알지 않아도 현재 타입을 편리하게 참조할 수 있습니다.Self
타입은 프로토콜을 준수하는 최종 타입을 나타냅니다.Self
타입은 선언에 의해 도입된 타입을 참조합니다. 타입의 멤버에 대한 선언 내에서 Self
타입은 해당 타입을 참조합니다. 클래스 선언의 멤버에서 Self
는 다음을 나타낼 수 있습니다:Self
인 인스턴스 메서드 f
를 보여줍니다.f
whose return type is Self
.Self
가 변수 자체의 컴파일 타임 타입 (compile-time type) Superclass
가 아닌 z
값의 런타임 타입 (runtime type) Subclass
를 참조하는 것을 보여줍니다.Self
타입은 가장 안쪽 타입 선언에 의해 도입된 타입을 참조합니다.Self
타입은 Swift 표준 라이브러리에서 type(of:)
함수와 동일한 타입을 참조합니다. 현재 타입의 멤버를 접근하기 위해 Self.someStaticMember
라고 작성하는 것은 type(of:self).someStaticMember
로 작성하는 것과 동일합니다.GRAMMAR OF A SELF TYPE self-type →Self
:
) 으로 시작하고 그 뒤에 타입 식별자의 목록이 옵니다.GRAMMAR OF A TYPE INHERITANCE CLAUSE type-inheritance-clause →:
type-inheritance-list type-inheritance-list → attributestype-identifier | attributestype-identifier,
type-inheritance-list
var x: Int = 0
으로 작성하는 대신에 var x = 0
으로 타입을 완벽하게 생략하고 작성할 수 있습니다—컴파일러는 x
를 타입 Int
의 값으로 추론합니다. 유사하게 컨텍스트에서 전체 타입이 추론될 수 있을 때 타입의 부분을 생략할 수 있습니다. 예를 들어 let dict: Dictionary = ["A": 1]
을 작성하면 컴파일러는 dict
이 타입 Dictionary<String, Int>
이라고 추론합니다.var x: Int = 0
에서 x
의 타입은 먼저 0
의 타입을 확인한 다음에 이 타입 정보를 루트 (변수 x
) 까지 전달하여 유추합니.eFloat
에 명시적 타입 주석 (: Float
) 은 숫자 리터럴 2.71828
이 Double
이 아닌 Float
타입을 유추하도록 합니다.