Attributes
Youngminah opened this issue · 0 comments
Youngminah commented
Attributes의 두가지 종류
Declaration Attributes
: 선언 속성Type Attributes
: 타입 속성
Declaration Attributes
-
available
- 특정 플랫폼과 운영체제 버전과 관련된 선언의 라이프 사이클을 나타낼 수 있다.
- 둘 이상의 콤마로 구분된 속성 인수의 목록으로 나타낸다.
@available(iOS 10.0, macOS 10.12, *)
class MyClass {
// class definition
}
-
discardableResult
- 값을 반환하는 함수가 결과를 반환하지 않더라도 컴파일러가 경고를 표시하지 않도록 하는 속성.
-
frozen
- 값을 반환하는 함수가 결과를 반환하지 않더라도 컴파일러가 경고를 표시하지 않도록 하는 속성.
-
main (Swift 5.3에서 생김)
- 프로그램 흐름에 대해 최상위 시작 지점을 포함하는 것을 나타내기 위해 구조체, 클래스 또는 열거형 선언에 적용할 수 있다.
- Structure, class, Enum에게 프로그램 플로우에서 가장 높은 레벨의 진입지점임을 가리키는 어노테이션
- 즉, 범용적인 새로운 엔트리 포인트 제공 기능이다.
- 이전에는 @UIApplicationMain 이라는 어트리뷰트로 엔트리포인트를 지정했었다.
- 타입은 인수가 없고 Void 를 반환하는 main 타입 함수를 제공해야 한다.
- 기본적으로 UIKit에서 엔트리 포인트는 AppDelegate였으며, main 메소드는 UIKit 내부에 숨어있다.
AppDelegate
는 프로토콜 확장을 통한 기본 구현 으로 static func main() 을 제공했기 때문에 안보이는 것- 만약, 직접 Custom Class를 만들고 그위에
@main
을 선언해주고, 함수를 처리해준다면 AppDelegate
는 실행되지 않고 커스텀 클래스만 실행된다음 종료된다.
-
objc
#selector
와 함께 자주 보았던 선언 속성일 것이다.- 명시적으로 컴파일러가 해당 코드를 Objective-C로 변환하도록 한다.
-
propertyWrapper
- 프로퍼티 래퍼 (property wrapper) 로 해당 타입을 사용하기 위해 클래스, 구조체, 또는 열거형 선언에 이 속성을 적용한다.
- 프로퍼티 래퍼를 까먹었다면 이전글 참고 : PropertyWrapper
- 타입에 이 속성을 적용하면 타입과 동일한 이름으로 사용자 정의 속성을 생성
- 지역과 전역 변수는 프로퍼티 래퍼를 사용할 수 없음.
- 위의 선언 속성으로 프로퍼티 래퍼를 꾸리면 중복 코드를 방지 할 수 있음.
@propertyWrapper
struct SomeWrapper {
var wrappedValue: Int
var someValue: Double
init() {
self.wrappedValue = 100
self.someValue = 12.3
}
init(wrappedValue: Int) {
self.wrappedValue = wrappedValue
self.someValue = 45.6
}
init(wrappedValue value: Int, custom: Double) {
self.wrappedValue = value
self.someValue = custom
}
}
struct SomeStruct {
// Uses init()
@SomeWrapper var a: Int
// Uses init(wrappedValue:)
@SomeWrapper var b = 10
// Both use init(wrappedValue:custom:)
@SomeWrapper(custom: 98.7) var c = 30
@SomeWrapper(wrappedValue: 30, custom: 98.7) var d
}
Type Attributes
-
autoclosure
- 인수 없이 해당 표현식을 클로저에 자동으로 래핑하여 표현식의 평가를 지연하기 위해 이 속성을 적용
- 함수의 인자로 전달되는 코드를 감싸서 자동으로 클로저로 만들어 준다.
- 즉, 반 표현의 코드를 클로저 표현의 코드로 만들어 주는 역할
- 이때 사용되는 클로저는 인자가 없고 리턴값만 존재해야 한다 ❗️
-
autoclosure 사용하지 않은 기본적으로 우리가 사용하던 코드
func normalPrint(_ closure: () -> Void) {
closure()
}
normalPrint({ print("I'm Normal Expression") })
-
autoclosure 사용한 코드
func autoClosurePrint(_ closure: @autoclosure () -> Void) {
closure()
}
autoClosurePrint(print("I'm AutoClosure Expression"))
- 코드가 훨씬 간단해졌음을 알 수 있다.
-
escaping
- 나중에 실행하기 위해 파라미터의 값이 저장될 수 있음을 나타내기 위해 메소드 파라미터 타입에 적용하는 속성.
- 이는 값이 호출 수명보다 오래 지속될 수 있음을 의미