Swift에 Interface가 있다고??

Daehee Kim·2022년 5월 3일
1
post-thumbnail

공부를 하기 싫어서 그냥 즐거운 마음으로 코딩을 하고 있었습니다. 그러다 이상한 네모 버튼이 있어서 그걸 눌러보니 듣도 보도 못한 Generated Interfaces라는 항목이 있어서 공부하여 정리해 보았습니다.

우선 Swift는 객체 지향 프로그래밍이 아닌 프로토콜 지향 프로그래밍 입니다. 따라서 우리는 Interface 대신에 protocol 이라는 친구를 사용합니다. protocol를 공부하시려면 다른 블로그를 가시는 것을 추천드립니다ㅎㅎ

Generated Interface 하는 방법

먼저 Xcode를 열어서 동그라미 친 저 모양을 찾아줍니다.

저 동그란 원 안에 있는 아이콘을 클릭하면 맨 밑에 Generated Interface라는 항목이 있습니다. 버튼을 클릭하게 된다면 Objective-C 코드로 된 Header가 보이게 될 것입니다.

근데 이게 뭐지???

예 저는 잘 모르겠습니다. 어렵다는 Objective-C를 보니 머리가 어질어질했습니다. 그래서 일단 구글링을 했는데 안나오더라고요..? 그래서 얘네가 뭐 하는 애들인지 여러분들에게 설명해 드리겠습니다.

Interface는 왜 쓰는 걸까요? 그 이유는 Objective-C의 코드를 Swift애서 사용하기 위한 단계의 일부이기 때문입니다. 다른 언어에 다른 방식을 사용하고 있는 두 언어인데도 우리가 두 코드를 혼합하여 사용할 때에 문제가 생기지 않는 이유라고 보시면 될 거 같습니다.

예시로 먼저 BaseViewController를 한번 보겠습니다.
밑에 있는게 BaseVC(BaseViewController)의 Interface입니다.

@class UITouch;
@class UIEvent;

SWIFT_CLASS("_TtC9Chart_IOS18BaseViewController")
@interface BaseViewController : UIViewController
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (void)viewWillAppear:(BOOL)animated;
- (void)touchesBegan:(NSSet<UITouch *> * _Nonnull)touches withEvent:(UIEvent * _Nullable)event;
- (void)viewDidLoad;
- (void)updateViewConstraints;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil SWIFT_UNAVAILABLE;
@end

objective-c 지원이 안되네요ㅜㅜ

밑에 있는 코드는 Swift BaseVC입니다.

class BaseViewController: UIViewController {
    
    init() {
        super.init(nibName: nil, bundle: nil)
    }    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewWillAppear(_ animated: Bool) {}
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){
          self.view.endEditing(true)
    }
    
    override func viewDidLoad() {}
    override func updateViewConstraints() {}
    
    func initialize() { }
    func configureUI() {}
    func setupConstraints() {}
    func setLayout() {}
    
}

지금 대충 보면 이름이 같은 친구들이 보이죠? 예를 들기 위해 초기화 코드를 한번 살펴보겠습니다.

// Objective-C Code
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;

// Swift Code
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

딱 보시면 아시겠죠 저거는 클래스 init를 하는 코드입니다. 이 코드들은 모두 자동으로 생성해 줍니다. required init은 initWithCoder로 변경돠는 것을 볼 수 있습니다.

다른 예제를 살펴보자면

// Objective-C Code
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;
- (instancetype)initName:(NSString *)name;
- (NSInteger)playAt:(Location)location for:(NSInteger)minutes; 


// Swift Code
init(name: String, age: Int)
init(name: String)
func play(at location: Location, for minutes: Int) -> Int

이렇게 자동으로 이름을 생성해 주는 것을 볼 수 있습니다.
또한 각자 안에 들어가는 메게변수들도 알아서 NS키워드를 붙여서 알아서 타입 변환을 해 줍니다.

열거형 케이스도 한번 살펴보겠습니다.

// Swift Code
public enum Location : Int {
    case park
    case home
    case lake
}

// Objective-C Code
typedef NS_ENUM(NSInteger, Location) {
    LocationPark,
    LocationHome,
    LocationLake
};

이렇게 알아서 바꿔주는 것을 볼 수 있습니다.

마치며...

사실 이거는 Objective-C 개발자들은 알고 있었을 내용이자먼 저같은 1년차 주니어 개발자는 이런 사소한 기능들을 알 리가 없습니다. 그러다 우연히 이러한 사소한 기능들을 발견하면 뭔지 모른 상태로 그냥 넘어가는 경우가 많은데 이번에는 한번 공부 해 보았씁니다.

결론은 Apple이 알아서 해주니까 그냥 편하게 사용합시다.
오타나 틀린 내용이 있다면 댓글 부탁드립니다 :)

profile
IOS 공부중입니다

0개의 댓글