discardableResult
속성은 함수가 값을 반환하지만 반환값이 사용되지 않을 때 컴파일러는 경고를 생성하지 않는 것을 나타냅니다.@
기호 다음에 속성의 이름과 속성이 허용하는 인수를 작성합니다:available
속성은 둘 이상의 콤마로 구분된 속성 인수의 목록으로 나타납니다. 이러한 인수는 다음의 플랫폼 또는 언어 이름 중 하나로 시작합니다:iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
macCatalyst
macCatalystApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
*
) 를 사용하여 위에 나열된 모든 플랫폼 이름에 대한 선언의 가용성을 나타낼 수도 있습니다. Swift 버전을 사용하여 지정한 가용 available
속성은 별표를 사용할 수 없습니다.unavailable
인수는 선언이 지정된 플랫폼에서 가능하지 않음을 나타냅니다. 이 인수는 Swift 버전 가용성을 지정할 때 사용될 수 없습니다.introduced
인수는 선언이 도입된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다. 다음과 같은 형식을 가집니다:deprecated
인수는 선언이 사용되지 않는 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다. 다음과 같은 형식을 가집니다::
) 도 생략합니다.obsoleted
인수는 선언이 폐기된 지정된 플랫폼 또는 언어의 첫번째 버전을 나타냅니다. 선언이 폐기되면 지정된 플랫폼 또는 언어에서 제거되고 더이상 사용이 불가능합니다. 다음의 형식을 가집니다:message
인수는 지원 중단되거나 폐기된 선언 사용에 대한 경고나 에러를 생성할 때 컴파일러가 표시하는 텍스트 메세지를 제공합니다. 다음의 형식을 가집니다:renamed
인수는 이름이 변경된 새로운 선언을 나타내는 텍스트 메세지를 제공합니다. 컴파일러는 이름이 변경된 선언 사용에 대한 에러를 생성할 때 새로운 이름을 표시합니다. 다음의 형식을 가집니다:renamed
와 unavailable
인수로 available
속성을 적용할 수 있습니다. 이 조합으로 인해 컴파일 시 선언이 변경되었다는 에러가 발생합니다.available
속성을 적용하여 다른 플랫폼과 다른 Swift 버전에서 선언의 가용성을 지정할 수 있습니다. available
속성이 적용된 선언은 현재 타겟이 지정한 플랫폼 또는 언어 버전이랑 일치하지 않으면 무시됩니다. 여러개의 available
속성을 사용하는 경우 효과적인 가용성은 플랫폼과 Swift 가용성의 조합입니다.available
속성이 플랫폼 또는 언어 이름 인수 외에 introduced
인수를 지정하는 경우 아래와 같은 짧은 구문을 사용할 수 있습니다:available
속성에 대한 짧은 구문은 여러 플랫폼에 대한 가용성을 간결하게 표현합니다. 두 형식은 동일하지만 가능하면 짧은 형식을 선호합니다.available
속성은 선언의 플랫폼 가용성을 추가로 지정할 수 없습니다. 대신에 Swift 버전 가용성과 하나 이상의 플랫폼 가용성을 지정하기 위해 분리된 available
속성을 사용합니다.dynamicallyCall(withArguments:)
메서드, dynamicallyCall(withKeywordArguments:)
메서드 또는 둘 다 구현해야 합니다.dynamicallyCall(withArguments:)
메서드의 선언은 위의 예제에서 [Int]
와 같이 ExpressibleByArrayLiteral
프로토콜을 준수하는 하나의 파라미터만 가져야 합니다. 반환 타입은 모든 타입이 가능합니다.dynamicallyCall(withKeywordArguments:)
메서드를 구현하는 경우 동적 메서드 호출에 라벨을 포함할 수 있습니다.dynamicallyCall(withKeywordArguments:)
메서드의 선언은 ExpressibleByDictionaryLiteral
프로토콜을 준수하는 단일 파라미터를 가지고 반환 타입은 모든 타입이 가능합니다. 파라미터의 Key
는 ExpressibleByStringLiteral
이어야 합니다. 이전 예제는 파라미터 타입으로 KeyValuePairs
를 사용하므로 호출자는 중복 파라미터 라벨을 포함할 수 있습니다—a
와 b
는 repeat
을 호출하는데 여러번 나타납니다.dynamicallyCall
메서드 모두 구현하면 dynamicallyCall(withKeywordArguments:)
는 메서드 호출이 키워드 인수를 포함할 때 호출됩니다. 다른 경우에는 dynamicallyCall(withArguments:)
가 호출됩니다.dynamicallyCall
메서드 구현 중 하나에서 지정한 타입과 일치하는 인수와 반환값으로만 동적으로 호출 가능한 인스턴스를 호출할 수 있습니다. 다음 예제에서 호출은 KeyValuePairs<String, String>
을 가지는 dynamicallyCall(withArguments:)
의 구현이 없으므로 컴파일 되지 않습니다.subscript(dynamicMemberLookup:)
서브 스크립트로 구현되어야 합니다.subscript(dynamicMemberLookup:)
서브 스크립트를 호출하는 것으로 이해되고 멤버에 대한 정보를 인수로 전달합니다. 서브 스크립트는 키 경로 또는 멤버 이름으로 파라미터를 사용할 수 있습니다; 두 서브 스크립트를 모두 구현하면 키 경로 인수를 가지는 서브 스크립트가 사용됩니다.subscript(dynamicMemberLookup:)
의 구현은 KeyPath
, WritableKeyPath
, 또는 ReferenceWritableKeyPath
타입의 인수를 사용하여 키 경로를 허용할 수 있습니다. 대부분 String
인 ExpressibleByStringLiteral
프로토콜을 준수하는 타입의 인수를 사용하여 멤버 이름을 허용할 수 있습니다. 서브 스크립트의 반환 타입은 모든 타입이 가능합니다.NOTE 컴파일러가 라이브러리 진화 모드로 있지 않으면 모든 구조체와 열거형은 암시적으로 고정 (frozen) 이고 이 속성은 무시됩니다.
usableFromInline
속성으로 표시되어야 합니다. 고정된 구조체의 프로퍼티는 프로퍼티 관찰자를 가질 수 없고 저장된 인스턴스 프로퍼티에 대해 초기값을 제공하는 표현식은 inlinable 에서 설명한대로 인라인 가능한 함수와 동일한 제한사항을 따릅니다.-enable-library-evolution
옵션을 Swift 컴파일러에 전달해야 합니다. Xcode 에서 가능하게 하려면 Xcode 도움말 (Xcode Help) 에서 설명한대로 "Build Libraries for Distribution" 빌드 설정 (BUILD_LIBRARY_FOR_DISTRIBUTION
) 을 Yes 로 설정해야 합니다.default
케이스를 요구하지 않습니다. 고정된 열거를 전환할 때 default
또는 @unknown default
를 포함하면 해당 코드는 실행되지 않기 때문에 경고가 생성됩니다.objc
속성을 의미합니다.public
기호로 선언된 모든 모듈에서 상호작용 할 수 있고 usableFromInline
속성으로 표시된 동일한 모듈에서 선언된 internal
기호와 상호작용 할 수 있습니다. 인라인 가능한 코드는 private
또는 fileprivate
기호와 상호작용 할 수 없습니다.fileprivate
또는 private
선언에 적용될 수 없습니다. 인라인 가능한 함수 내부에 선언된 함수와 클로저는 이 속성으로 표시될 수 없더라도 암시적으로 인라인 입니다.Void
를 반환하는 main
타입 함수를 제공해야 합니다. 예를 들어:main
속성의 요구사항을 설명하는 또다른 방법은 이 속성을 작성하는 타입이 다음의 가상의 프로토콜을 준수하는 타입과 동일한 요구사항을 충족해야 한다는 것입니다:objc
속성을 억제하기 위해 메서드, 프로퍼티, 서브 스크립트, 또는 초기화 구문 선언에 이 속성을 적용합니다. nonobjc
속성은 Objective-C 에서 표현 가능하더라도 Objective-C 코드로 선언이 불가능 하도록 컴파일러에게 말합니다.objc
속성으로 표시되지 않은 확장의 모든 멤버에 같은 영향을 미칩니다.objc
속성으로 표시된 클래스의 브릿징 메서드에 대한 순환성을 확인하고 objc
속성으로 표시된 클래스의 메서드와 초기화 구문에 오버로딩을 허용하기 위해 nonobjc
속성을 사용합니다.nonobjc
속성으로 표시된 메서드는 objc
속성으로 표시된 메서드로 재정의할 수 없습니다. 그러나 objc
속성으로 표시된 메서드는 nonobjc
속성으로 표시된 메서드로 재정의할 수 있습니다. 유사하게 nonobjc
속성으로 표시된 메서드는 objc
속성으로 표시된 메서드에 대한 프로토콜 요구사항을 충족할 수 없습니다.NSApplicationMain(_:_:)
함수를 호출하는 것과 동일합니다.NSApplicationMain(_:_:)
함수를 호출하는 최상위의 코드로 main.swift
파일을 적용해야 합니다:copyWithZone(_:)
메서드에 의해 반환된 프로퍼티의 값의 복사본 (copy) 으로 프로퍼티의 setter 가 합성됩니다. 프로퍼티의 타입은 NSCopying
프로토콜을 준수해야 합니다.NSCopying
속성은 Objective-C copy
프로퍼티 속성와 유사하게 동작합니다.NSManagedObject
를 상속하는 클래스의 인스턴스 메서드나 저장된 변수 프로퍼티에 이 속성을 적용합니다. NSManaged
속성으로 표시된 프로퍼티의 경우 코어 데이터 (Core Data) 는 런타임에 스토리지 (storage) 도 제공합니다. 이 속성을 적용하면 objc
속성도 의미합니다.objc
속성은 선언이 Objective-C 코드에서 사용 가능함을 컴파일러에게 말합니다.nonobjc
속성으로 표시되지 않은 확장의 모든 멤버에 적용됩니다.objc
속성을 추가합니다. 그러나 하위클래스는 제너릭이 아니어야 하며 제너릭 클래스를 상속해선 안됩니다. 아래에서 설명한대로 Objective-C 이름을 지정하기 위해 이러한 기준을 충족하는 하위클래스에 objc
속성을 명시적으로 추가할 수 있습니다. objc
속성으로 표시된 프로토콜은 이 속성이 표시되지 않은 프로토콜을 상속할 수 없습니다.objc
속성은 다음과 같은 경우에 암시적으로 추가됩니다:objc
속성을 가지고 있습니다.objc
속성을 가지는 프로토콜의 요구사항을 충족합니다.IBAction
, IBSegueAction
, IBOutlet
, IBDesignable
, IBInspectable
, NSManaged
, 또는 GKInspectable
속성을 가지고 있습니다.Planet
열거형에서 명명된 케이스 venus
는 명명된 케이스 PlanetVenus
로 Objective-C 코드로 노출됩니다.objc
속성은 식별자로 구성된 단일 속성 인수를 선택적으로 허용합니다. 식별자는 objc
속성을 적용하는 엔티티에 대해 Objective-C 로 노출될 이름을 지정합니다. 클래스, 열거형, 열거형 케이스, 프로토콜, 메서드, getter, setter, 그리고 초기화 구문 이름으로 이 인수를 사용할 수 있습니다. 클래스, 프로토콜, 또는 열거형에 대해 Objective-C 이름을 지정하는 경우 Objective-C 를 사용한 프로그래밍 (Programming with Objective-C) 에서 규칙 (Conventions) 에서 설명한대로 세글자의 접두사를 포함합니다. 아래 예제는 프로퍼티 자체의 이름이 아닌 isEnabled
로 Objective-C 에 ExampleClass
의 enabled
프로퍼티에 대한 getter 를 노출합니다.NOTE objc 속성에 인수는 해당 선언에 대한 런타임 이름도 변경할 수 있습니다.NSClassFromString
과 같이 Objective-C 런타임과 상호작용하는 함수를 호출할 때와 앱의 info.plist 파일의 클래스 이름을 지정할 때 런타임 이름을 사용합니다. 인수를 전달하여 이름을 지정하면 해당 이름은 Objective-C 코드에서 이름과 런타임 이름으로 사용됩니다. 인수를 생략하면 Objective-C 코드에서 사용된 이름은 Swift 코드의 이름과 일치하고 런타임 이름은 일반 Swift 컴파일러 이름 변경 규칙을 따릅니다.
objc
속성을 클래스의 모든 Objective-C 호환 멤버, 확장, 하위클래스, 그리고 모든 확장의 하위클래스에 적용합니다.objc
속성을 대신 사용합니다. 많은 선언의 노출이 필요하다면 objc
속성을 가지는 확장에 그룹화 할 수 있습니다. objcMembers
속성은 Objective-C 런타임의 내부 기능을 많이 사용하는 라이브러리에 대해 편리합니다. 필요하지 않은 곳에 objc
속성을 적용하면 바이너리 크기를 증가시키고 성능에 부정적인 영향을 미칠 수 있습니다.wrappedValue
인스턴스 프로퍼티를 정의해야 합니다. 프로퍼티의 래핑된 값 (wrapped value) 은 이 프로퍼티에 대해 getter 와 setter 를 노출하는 값입니다. 대부분의 경우 wrappedValue
는 계산된 값이지만 대신 저장된 값이 될 수 있습니다. 래퍼는 래핑된 값에 필요한 기본 저장소를 정의하고 관리합니다. 컴파일러는 래핑된 프로퍼티의 이름 앞에 언더바 (_
) 로 래퍼 타입의 인스턴스에 대해 저장소를 합성합니다. 예를 들어 someProperty
에 대한 래퍼는 _someProperty
로 저장됩니다. 래퍼에 대한 합성된 저장소는 private
의 접근 제어 수준을 가집니다.willSet
과 didSet
블럭을 포함할 수 있지만 컴파일러가 합성한 get
또는 set
블럭을 재정의할 수 없습니다.wrappedValue
파라미터에 대한 인수로 전달할 수 있습니다. 프로퍼티에 속성을 적용할 때 속성에 인수를 제공할 수도 있으며 이 인수는 프로퍼티 래퍼의 초기화 구문으로 전달됩니다. 예를 들어 아래 코드에서 SomeStruct
는 SomeWrapper
가 정의한 각 초기화 구문을 호출합니다.projectedValue
인스턴스 프로퍼티를 정의합니다. 컴파일러는 래핑된 프로퍼티의 이름 앞에 달러 기호 ($
) 로 계획된 값에 대한 식별자를 합성합니다. 예를 들어 someProperty
에 대한 계획된 값은 $someProperty
입니다. 계획된 값은 기존의 래핑된 프로퍼티와 동일한 접근 제어 수준을 가집니다.resultBuilder
속성을 어떻게 사용하는지에 대한 예제는 결과 빌더 (Result Builders) 를 참고 바랍니다.buildBlock(_:)
메서드는 필수입니다. DSL 에서 추가 기능을 활성화 하는 다른 메서드는 옵셔널 입니다. 결과 빌더 타입의 선언은 프로토콜 준수를 포함할 필요가 없습니다.Expression
타입은 결과 빌더의 입력의 타입에 대한 기호이고 Component
는 부분 결과의 타입에 대한 기호이며 FinalResult
는 결과 빌더가 생성하는 결과의 타입에 대한 기호입니다. 이러한 타입을 결과 빌더가 사용하는 실제 타입으로 바꿉니다. 결과-빌딩 메서드가 Expression
또는 FinalResult
에 대한 타입을 지정하지 않으면 Component
와 기본적으로 동일합니다.static func buildBlock(_ components: Component...) -> Component
\static func buildOptional(_ component: Component?) -> Component
\nil
이 가능한 부분 결과로 부터 부분 결과를 빌드합니다. else
절을 포함하지 않은 if
구문을 지원하려면 이 메서드를 구현해야 합니다.static func buildEither(first: Component) -> Component
\switch
구문과 else
절을 포함하는 if
구문을 제공하려면 이 메서드와 buildEither(second:)
를 모두 구현해야 합니다.static func buildEither(second: Component) -> Component
\switch
구문과 else
절을 포함하는 if
구문을 제공하려면 이 메서드와 buildEither(first:)
를 모두 구현해야 합니다.static func buildArray(_ components: [Component]) -> Component
\for
루프를 지원하려면 이 메서드를 구현해야 합니다.static func buildExpression(_ expression: Expression) -> Component
\static func buildFinalResult(_ component: Component) -> FinalResult
\static func buildLimitedAvailability(_ component: Component) -> Component
\Component
와 Expression
을 정의하여 아래 예제를 위의 메서드의 목록보다 쉽게 일치하도록 만듭니다.buildExpression(_:)
메서드를 가지면 각 표현식은 해당 메서드에 대한 호출이 됩니다. 이 변환은 항상 첫번째 입니다. 예를 들어 다음의 선언은 동등합니다:()
으로 평가되는 것으로 이해됩니다. 구체적으로 할당을 처리하기 위해 ()
타입의 인수를 가지는 buildExpression(_:)
의 오버로드를 정의할 수 있습니다.buildLimitedAvailability(_:)
메서드에 대한 호출이 됩니다. 이 변환은 buildEither(first:)
, buildEither(second:)
, 또는 buildOptional(_:)
에 대한 호출로 변환되기 전에 발생합니다. buildLimitedAvailability(_:)
메서드를 사용하여 어떤 분기를 사용하는지에 따라 변경되는 타입 정보를 지웁니다. 예를 들어 아래의 buildEither(first:)
와 buildEither(second:)
메서드는 두 분기에 대한 타입 정보를 캡처하는 제너릭 타입을 사용합니다.FutureText
는 DrawEither
제너릭 타입에서 타입 중 하나이므로 brokenDrawing
의 타입의 부분으로 나타납니다. 이로 인해 런타임에 FutureText
를 사용할 수 없는 경우 해당 타입이 명시적으로 사용되지 않는 경우에도 프로그램이 중된될 수 있습니다.buildLimitedAvailability(_:)
메서드를 구현합니다. 예를 들어 아래의 코드는 가용성 검사로 부터 AnyDrawable
값을 빌드합니다.buildEither(first:)
와 buildEither(second:)
메서드에 대한 일련의 중첩된 호출이 됩니다. 구문의 조건과 케이스는 이진 트리의 잎 노드에 매핑되고 구문은 루트 노드에서 잎 노드로의 경로를 따라 buildEither
메서드에 대한 중첩된 호출이 됩니다.buildEither(first: buildEither(second: ... ))
와 같이 중첩된 호출이 됩니다. 다음의 선언은 동일합니다:else
절 없는 if
구문과 같이 값을 생성하지 않을 분기 구문은 buildOptional(_:)
에 대한 호출이 됩니다. if
구문의 조건이 충족되면 코드 블럭은 변환되고 인수로 전달됩니다; 그렇지 않으면 buildOptional(_:)
은 인수로 nil
가지고 호출됩니다. 예를 들어 다음의 선언은 동일합니다:do
구문은 buildBlock(_:)
메서드에 대한 호출이 됩니다. 블럭 내부의 각 구문은 한번에 하나씩 변환되고 buildBlock(_:)
메서드에 대한 인수가 됩니다. 예를 들어 다음의 선언은 동일합니다:for
루프는 임시 변수, for
루프, 그리고 buildArray(_:)
메서드에 대한 호출이 됩니다. 새로운 for
루프는 시퀀스를 반복하고 각 부분 결과를 해당 배열에 추가합니다. 임시 배열은 buildArray(_:)
호출에 인수로 전달됩니다. 예를 들어 다음의 선언은 동일합니다:buildFinalResult(_:)
메서드를 가지고 있으면 최종 결과는 해당 메서드에 대한 호출이 됩니다. 이 변환은 항상 마지막 입니다.break
, continue
, defer
, guard
, 또는 return
구문, while
구문, 또는 do
-catch
구문을 사용할 수 없습니다.throw
구문, 컴파일-시간 진단 구문, 또는 return
구문이 포함된 클로저도 변경하지 않습니다.4 + 5 * 6
은 해당 함수를 여러번 호출하는 대신 buildExpression(4 + 5 * 6)
으로 됩니다. 마찬가지로 중첩된 분기 구문은 buildEither
메서드에 대한 호출의 단일 이진 트리가 됩니다.NSManagedObject
에서 상속한 모든 클래스에 대해 유추됩니다.import
선언에 이 속성을 적용합니다. internal
접근-수준 수식어로 표시된 가져온 모듈의 엔티티는 public
접근-수준 수식어로 선언된 경우에 가져옵니다. internal
또는 public
접근-수준 수식어로 표시된 클래스와 클래스 멤버는 open
접근-수준 수식어로 선언된 경우에 가져옵니다. 가져온 모듈은 테스트가 활성화 된 상태로 컴파일되어야 합니다.UIApplicationMain
함수를 호출하는 것과 대리자 클래스의 이름으로 클래스의 이름을 전달하는 것과 같습니다.UIApplicationMain(_:_:_:_:)
함수를 호출하는 최상위 수준의 코드를 가지는 main.swift
파일을 제공해야 합니다. 예를 들어 주 클래스로 UIApplication
의 사용자 정의 하위클래스를 사용하면 이 속성을 사용하는 것 대신에 UIApplicationMain(_:_:_:_:)
함수를 호출합니다.internal
접근 수준 수식어를 가지고 있어야 합니다. usableFromInline
으로 표시된 구조체나 클래스는 프로퍼티에 대해 public 또는 usableFromInline
인 타입만 사용할 수 있습니다. usableFromInline
으료 표시된 열거형은 케이스의 원시값과 연관된 값에 대해 public 또는 usableFromInline
인 타입만 사용할 수 있습니다.public
접근 수준 수식어와 같이 이 속성은 모듈의 공개 인터페이스의 부분으로 선언을 노출합니다. public
과 다르게 컴파일러는 선언의 기호를 내보내더라도 모듈 외부의 코드에서 이름으로 참조되기 위해 usableFromInline
으로 표시된 선언을 허용하지 않습니다. 그러나 모듈 외부의 코드는 런타임 동작을 사용하여 선언의 기호와 상호작용 할 수 있습니다.inlinable
속성으로 표시된 선언은 암시적으로 인라인 가능한 코드에서 사용가능 합니다. inlinable
또는 usableFromInline
은 internal
선언에 적용될 수 있지만 두 속성 모두 적용하는 것은 에러입니다.IBAction
, IBSegueAction
, IBOutlet
, IBDesignable
, 그리고 IBInspectable
. 이 속성은 개념적으로 Objective-C 와 동일합니다.IBOutlet
과 IBInspectable
속성을 적용합니다. 클래스의 메서드 선언에 IBAction
과 IBSegueAction
속성을 클래스 선언에 IBDesignable
속성을 적용합니다.IBAction
, IBSegueAction
, IBOutlet
, IBDesignable
, 또는 IBInspectable
속성을 적용하는 것은 objc
속성을 의미합니다.autoclosure
속성을 어떻게 사용하는지에 대한 예제는 자동 클로 (Autoclosures) 와 함수 타입 (Function Type) 을 참고 바랍니다.convention
속성은 항상 다음의 인수 중 하나에 나타납니다:swift
인수는 Swift 함수 참조를 나타냅니다. 이것은 Swift 에서 함수 값에 대한 표준 호출 규칙입니다.block
인수는 Objective-C 호환 블럭 참조를 나타냅니다. 함수 값은 객체 내에 호출 함수 (invocation function) 을 포함하는 id
-호환성 Objective-C 객체 인 블럭 객체에 대한 참조로 표시됩니다. 호출 함수는 C 호출 규칙을 사용합니다.c
인수는 C 함수 참조를 나타냅니다. 함수 값은 컨텍스트를 전달하지 않으며 C 호출 규칙을 사용합니다.escaping
타입 속성을 가지는 함수 타입 파라미터는 프로퍼티나 메서드에 대해 self.
의 명시적 사용을 요구합니다. escaping
속성을 어떻게 사용하는지에 대한 예제는 이스케이프 클로저 (Escaping Closures) 를 참고 바랍니다.unknown
속성을 어떻게 사용하는지에 대한 예제는 향후 열거형 케이스 전환 (Switching Over Future Enumeration Cases) 를 참고 바랍니다.GRAMMAR OF AN ATTRIBUTE attribute →@
attribute-name attribute-argument-clauseattribute-name → identifier attribute-argument-clause →(
balanced-tokens)
attributes → attribute attributesbalanced-tokens → balanced-token balanced-tokensbalanced-token →(
balanced-tokens)
balanced-token →[
balanced-tokens]
balanced-token →{
balanced-tokens}
balanced-token → 모든 식별자, 키워드, 리터럴, 또는 연산자 balanced-token → 다음을 제외한 모든 구두점(
,)
,[
,]
,{
, 또}