[Swift4] Object-C 프로젝트에서 Swift 코드 객체 상호 호출

개발/iOS - Swift 2018. 8. 14. 14:14
반응형

저번 포스팅에 이어서 이번에는 상호 객체 호출하는 방법에 대해서 포스팅하도록 하겠습니다.

기본적으로 Swift 문법은 알고 있다고 생각하고 생성자, 객체 검사 등 설명은 패스하도록 할께요.


Object-C & Swift 셋팅이 설명되어 있는 이전 포스팅을 보지 못했다면 아래 링크로 가셔서 보시면 됩니다.

[Swift4] Object-C 프로젝트에서 Swift 코드 사용하기




1) Object-C 코드


Object-C 프로젝트를 생성하면 AppDelegate가 만들어 집니다. 여기서 Swift 객체를 사용해보도록 하겠습니다.

일단 Object-C 코드를 먼저 살펴 본 후에 Swift 코드도 살펴보도록 하겠습니다.


AppDelegate.m 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#import "AppDelegate.h"
#import "SampleApp-Swift.h"
 
@interface AppDelegate ()
 
@end
 
@implementation AppDelegate
 
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    MySwift *oSwift = [[MySwift alloc] init];
    [oSwift testSwiftWithStr:@"1234"];
    [oSwift getAppDelegateWith_obj:self];
    
    return YES;
}
 
-(void)testObjc
{
    NSLog(@"testObjec == ");
}
cs


2번 줄: 전 포스팅에서 "Product Name" 잘 기억하라고 했었죠? 

           "[Product Name]-Swift.h" 를 작성하시면 됩니다.  

           그러면 모든 Swift 코드가 Import 됩니다. 

           (Swift는 애플에서 만든 SDK를 제외하고 Import 를 안해도 모두 공유가 됩니다. )


13~14 번 줄: Swift Class 인 "MySwift" Class를 선언 & 생성 하고 Swift에 선언된 메소드를 호출 합니다. 


15 번 줄: AppDelegate 객체를 Swift 에 넘겨 줍니다. 그래서 반대로 호출 할 수 있도록 해줍니다. 


20 번 줄: testObjc는 Swift에서 호출 할 메소드로 헤더에도 선언해 줍시다.

2) Swift 코드


MySwift.swift 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import Foundation
 
@objc (MySwift)
class MySwift : NSObject
{
    func testSwift(str:String-> Void
    {
        print("MySwift : \(str)")
    }
        
    func getAppDelegate(_obj:Any?) -> Void
    {
        if let obj = _obj as? AppDelegate
        {
            obj.testObjc();
        }
    }
}
cs


3 번 줄: @objc 를 선언해줌으로써 Object-C 에서도 호출 가능하도록 설정합니다.


11 번 줄: "1) 에 15 번줄"이 호출 되면 MySwift의 getAppDelegate가 호출 됩니다.

              Object-C 에서 인텔리전트가 나오지 않는다면 빌드(Cmd+B)를 한 후 해보시면 인텔리전트가 나올껍니다.


15 번 줄: AppDelegate의 testObjc 메소드를 호출합니다. 


자~ 여기까지 입력하시고 컴파일 해보면 아래 이미지처럼 에러가 나실껍니다. 


이유는 AppDelegate를 못찾기 때문입니다. 전 포스팅에서 Bridge 헤더 만들겠냐고 팝업떠서 만든거 기억하시죠?

여기에다가 Import 해줘야 인식을 하게 됩니다. 



위 이미지처럼 Import 해주시고 컴파일하면 정상적으로 컴파일이 되고 실행도 되실껍니다.




3) 실행 결과


어떤가요? 동일하게 로그가 출력 되었나요?



반응형
admin