본문 바로가기

Swift

Attribute (@어쩌구)

728x90

AppDelegate, SceneDelegate 또는 외부 라이브러리 등을 보면 종종 보이는 것 중에 하나가 어노테이션이다.

분명 나는 잘 모르는데 남들은 잘 사용하는 것 같은 기능이다.

 

역시나 보다 자세하고 정확한 정보는 공식 문서를 통해서 확인하는 것이 좋다. 

여기서는 자주 사용하거나 .. 지금 생각나는 것을 위주로 정리할 예정이다. 아닐 수도

 

어떤 것들이 있는지 살펴보기 전에 무엇인지 먼저 알아보자.

Attribute가 뭔데?

이름에서 알 수 있는 것처럼 Attribute는 일종의 속성을 명시한다.

클래스, 프로퍼티, 함수, 파라미터 앞에 위치해서 그것이 특정한 동작을 하도록 어떤 속성을 가질 수 있는 알려주는 것이다. 

 

@로 시작하며 아래와 같은 구조를 갖고 있다.

@Attribute_Name
@Attribute_Name(Attribute_Arguments

 

Attribute에는 어떤 것이 있어? 

공식 문서를 통해서 확인해보면 알 수 있지만 .. 엄청 많다 .. 여기서는 내가 알고 있거나 .. 본 적이 있는 것을 .. 다룰 예정이다 ..

 

@available

주로 외부 라이브러리 || 버전이 업데이트 되면서 새로운 기능을 사용할 때 자주 보이는 키워드이다.

특정한 플랫폼이나 버전을 지정할 때 사용하고 그 외에도 introduced: deprecated:, obsolted: 를 사용해서 선언의 생명주기를 지정할 때도 사용한다. 

@available(iOS 15.0, *)

 

 

주의할 것은 #available과 다르다는 것이다.

 if #available(iOS 14.0, *) {
   // iOS 14, 15
 } else {
   // iOS 14 아래 버전 
}

 

*은 필수로 작성해야 한다. 

#available은 여러 플랫폼에서 서로 다른 논리 처리를 위해 if 또는 guard 문과 함께 사용된다. 즉, bool 을 반환하는 런타임 검사라는 것을 확인할 수 있다. 

 

@available은 메서드/클래스/프로토콜 앞에 쓸 수 있다. 타입 또는 프로토콜이 적용되는 플랫폼 및 OS를 의미한다.

이는 deployment target과 관련이 깊다.

 

@available(iOS 14, *)
func touchupDoneButton() { }

이렇게 작성하면 iOS 14를 포함한 그 이상의 버전에서만 touchupDoneButton을 호출할 수 있다. 

하나의 플랫폼 뿐 아니라 여러개도 가능하다.

@available(iOS 10.0, macOS 10.12, *)
func touchupDoneButton() { }

 

#available과 다르게 컴파일 타임에 경고 또는 오류를 낸다.

 

@discardableResult

이름에서 알 수 있는 것처럼 결과를 사용하지 않아도 경고를 내지 않게 만들 수 있다.

 

예를 들어서 반환값이 있는 메서드의 결과를 사용하지 않으면 컴파일 시 경고 메시지를 볼 수 있다. 그러나 해당 속성을 사용하면 결과를 사용하지 않아도 컴파일러가 경고를 하지 않는다.

class ViewController: UIViewController {
    func sample() -> Int {
        return 1
    }

    @discardableResult
    func sample2() -> Int {
        return 1
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        sample() // Warning: Result of call to 'poo()' is unused
        sample2()
    }
}

 

@main, @UIApplicationMain

프로그램의 진입점을 설정한다.

Xcode12 이후로 새로 만드는 프로젝트에 있어서 AppDelegate에 자동으로 붙어서 나오는 것을 확인할 수 있다. 

 

@objc

UIKit에서 #selector와 함께 많이 사용하는 attribute이다.

명시적으로 컴파일러가 해당 코드를 objective-c로 변환하도록 해준다. 

 

@IBAction, @IBSegueAction, @IBOutlet, @IBDesignable, @IBInspectable

스토리보드 인터페이스 빌더에서 사용하는 attribute이다.

 

이 중에서 @IBDesignable, @IBInspectable를 좀 더 살펴보자.

해당 속성을 사용하면 컴파일 시점의 인터페이스 빌더에서 객체의 속성을 적용하고 확인할 수 있다. 실시간으로 반영된 것을 확인할 수 있다.

 

예를 들어서 버튼의 속성 중에서 테두리 || 곡률값의 경우는 코드로 작성한 다음에 빌드 한 뒤 확인할 수 있었다.

그러나 @IBInspectable과 @IBDesignable을 사용하면 스토리보드에서 적용한 다음 바로 스토리보드 상에서 바로 변경된 것을 볼 수 있다.

import UIKit

@IBDesignable
class SeSACButton: UIButton {
    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = (newValue)
        }
    }

    @IBInspectable
    var borderWidth: CGFloat {
        get { return layer.borderWidth }
        set { layer.borderWidth = newValue }
    }
    
    @IBInspectable
    var borderColor: UIColor {
        get { return UIColor(cgColor: layer.borderColor!) }
        set { layer.borderColor = newValue.cgColor }
    }
}

- IBDesignable을 통해서 실시간으로 반영되는 것을 스토리보드 상에서 확인할 수 있고,

- IBInspectable을 통해서 인스펙터에서 해당 UIComponet의 속성을 변경할 수 있다. 

 

이렇게 인스펙터에서 속성을 수정할 수 있고,

반영된 모습을 바로 확인할 수 있다.

 

@escaping

탈출 클로저에서 볼 수 있는 attribute이다.

함수 타입에만 사용할 수 있고 파라미터 값이 함수 실행 이후에 실행될 수 있도록 한다.

생각보다 엄청 까다로운 기능 .. 

 

_

이외에도 많지만 일단 여기까지 .. 

 

'Swift' 카테고리의 다른 글

Framework (Dynamic VS Static)  (1) 2022.08.19
Access Control (feat. Framework)  (1) 2022.08.16
Closure (클로저)  (0) 2022.08.10
First-Class Citizen(일급 객체)  (0) 2022.08.09
Singleton Pattern  (0) 2022.08.05