본문 바로가기
개발/swift

@ attribute, @ symbol

by 꼬마상어 2018. 6. 7.
반응형

@

코드를 작성하다보면 종종 @ 를 많이 본다. (@objc, @escape, @IBOutlet, @IBAction 등등..)

실제로 개발 소스를 작성하면서 그것이 무슨 뜻인지에 대해 알지는 못했다. 그냥 쓰면 쓰는거지 이생각

이건 실제로 Attributes라고 언급한다. (검색하느냐 힘들었다. Attribute, symbol이라고 한다.)

Attribute는 컴파일러에게 특별한 신호라고 생각하면 된다.

 

자세한 영문 공식 홈페이지는 여기를 확인하자 : https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html

 

swift에서는 @ 심볼을 두가지 이유때문에 사용한다.

  1. 선언하기 위해
  2. 타입을 적용하기 위해

 

사용할 때는 아래와 같이 사용합니다.

@attribute name

@attribute name(attribute arguments)

 

Attributes 선언

available

해당 Attribute를 적용한다면 Swift 버전이나 특정 플랫폼 및 운영체제에 관련하여 제약사항을 걸 수 있습니다.

available 속성은 항상 두개나 그 이상의 argument를 가집니다.

그 argument 리스트는 아래와 같습니다.

  • iOS
  • iOSApplicationExtension
  • macOS
  • macOSApplicationExtension
  • watchOS
  • watchOSApplicationExtension
  • tvOS
  • tvOSApplicationExtension
  • swift

혹은 위에 언급된 리스트중 모든 플랫폼을 지원한다면 *를 사용할 수도 있습니다.

swift는 언어이므로 버전을 기입하므로 *는 허용하지 않습니다.

 

예를 들어 TechnicalPost 클래스를 iOS 10.0, macOS 10.12이상에서만 사용이 가능하다면 아래와 같이 작성합니다.

맨 뒤에 * 를 작성한 이유는 위에 언급했듯이 iOS, macOS이외에도 기타 OS가 존재하기 때문입니다.

@available(iOS 10.0, macOS 10.12, *)
class TechnicalPost {}

 

이런 Attribute는 라이브러리를 작성할 때 유용할 것으로 보입니다!

 

OS의 종류 뿐만 아니라 기재할 수 있는 attribute는 많습니다.

  • introduced

    • introduced: version_number
    • 해당 선언이 처음으로 언제부터 사용이 가능했는지 알려주도록 하는 속성입니다.
    • version_number는 1~3개의 인자를 콤마로 구분하여 작성합니다.
  • deprecated

    • deprecated: version_number
    • 해당 선언이 언제부터 사용하지 못하게 되었는지 알려주도록 하는 속성입니다.
    • (optional) version_number는 기입하지 않아도 됩니다.
  • message

    • message: message
    • deprecated 혹은 obsoleted되었을 때 warning 또는 error의 메세지로 사용됩니다.
    • (optional) version_number는 기입하지 않아도 됩니다.

이것들 외에도 많지만 다 적을수 없기에...

 

dicardableResult

이건 참 유용하게 쓰일 수 있는 Attribute 입니다.

method나 function을 호출하였지만 return값을 사용하지 않을 때 컴파일러 워닝이 뜨는데요.

이 결과값을 사용하지 않을 경우에도 거슬리는 warning메세지가 뜨지 않도록 하는 속성입니다.

 

dynamicMemberLookup

이 속성을 클래스, 구조체, enum 혹은 protocol에 적용한다면 runtime에 name을 통해 멤버에 접근이 가능합니다.

이 속성을 적용하려면 반드시 subscript(dynamicMemberLookup:) 을 작성하여야합니다.

@dynamicMemberLookup
struct DynamicStruct {
    let dictionary = ["someDynamicMember": 325,
                      "someOtherMember": 787]
    subscript(dynamicMember member: String) -> Int {
        return dictionary[member] ?? 1054
    }
}
let s = DynamicStruct()

// Using dynamic member lookup
let dynamic = s.someDynamicMember
print(dynamic)
// Prints "325"

// Calling the underlying subscript directly
let equivalent = s[dynamicMember: "someDynamicMember"]
print(dynamic == equivalent)
// Prints "true"

 

Type 속성

autoclosure

우리는 가끔 method에 값을 입력할때 연산식을 입력할때가 있다. 아래와 같이.

원래 generic 만 사용가능하지만 우리는 연산식을 넣었다.

func XCTAssertEqual<T>(_ expression1: @autoclosure () throws -> T?, _ expression2: @autoclosure () throws -> T?, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line) where T : Equatable

XCAssertEqual은 위와 같이 @autoclosure가 매개 변수 앞에 작성되어있고, 이는 코드 작성을 예쁘게 보일 수 있도록 도와준다.

XCTAssertEqual({
    return aDev.pay + raiseAmount,
}, {
    return 75000
}, "Unexpected salary after raise was applied.")

->

XCTAssertEqual(aDev.pay + raiseAmount, 750000, "Unexpected salary after raise was applied.")

 

esacping

swift3 부터는 @noescaping이 기본값이 되어 필요한 경우에 @escaping을 명시하도록 되었다.

function에서 파라미터를 클로저로 넘겨주면, 해당 function내에서만 클로저를 사용하는 것이 아니고 함수 외부에서도 해당 클로저 파라미터를 사용하고자 한다면 @escaping 키워드를 사용한다.

만약 내부에서만 사용하고 싶다면 @noescaping 키워드를 사용한다.

 

 

 

이외에도 많은 Attribute들이 있는데..

있지만 쓰지 않는것도 많기 때문에 각자 알아서 찾아보기를 :)

 

참고

http://blog.naver.com/PostView.nhn?blogId=itperson&logNo=220996283382&categoryNo=103&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html

https://hcn1519.github.io/articles/2017-09/swift_escaping_closure

반응형

댓글