Youngminah/TIL

Attributes

Youngminah opened this issue · 0 comments

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

    • 나중에 실행하기 위해 파라미터의 값이 저장될 수 있음을 나타내기 위해 메소드 파라미터 타입에 적용하는 속성.
    • 이는 값이 호출 수명보다 오래 지속될 수 있음을 의미


참고자료

스위프트 문서 - Attributes
@main과 커스텀 엔트리 포인드