Swift 와 Objective-C 혼합 편집 주의사항

Swift 와 Objective-C 혼합 편집 주의사항 정리:
머리말
스 위 프 트 는 이미 출시 된 지 수년 이 지 났 으 며,오 브 젝 티 브-C 에 비해 스 위 프 트 의 언어 메커니즘 및 사용 편의 성 이 어느 정도 접목 되 어 iOS 입문 문턱 을 크게 낮 췄 다.물론 새로 들 어 온 어린이 신발 에 대해 서 는 복음 이 라 고 할 수 없 지만,전체 iOS 프로 그래 밍 종사자 들 에 게 는 정말'키 가 크 고,눈 깜짝 할 사이 에'키 가 작고 가난 하 다'는 것 이 었 다.게다가 학원 이 횡행 하면 서 대량 도매 로 iOS 는 그 당시 의 휘황찬란 함 을 더 이상 볼 수 없 었 다.iOS 10 이 출시 된 후에 Xcode 8 에 이 어 업 데 이 트 를 추 송 했 습 니 다.세심 한 사람 은 Xcode 8 에서 iOS 버 전의 최소 어 울 리 는 것 이 iOS 8.0 으로 바 뀌 었 고 Swift 버 전이 안정 되 었 습 니 다.어떤 의미 에서 보면 Swift 의 시대 가 본 격 적 으로 열 렸 고 Objective-C 를 대체 하 는 것 도 시간 문제 일 것 입 니 다.물론 그 전에 우리 도 준 비 를 잘 해 야 한다.올 해 는 점점 더 많은 회사 들 이 Swift 와 Objective-C 의 혼합 편성 을 시작 했다.
우 리 는 오늘 두 가지 혼합 편성 중의 주의사항 과 문 제 를 살 펴 보 자.
혼합 편성 하 다
혼합 편성 도 두 가지 상황 이 아니다.
Objective-C 프로젝트 나 파일 에 Swift 파일 사용 하기;
Swift 프로젝트 나 파일 에 Objective-C 파일 을 사용 합 니 다.
혼합 편집 과정 에서 가장 중요 한 두 파일:
1.브리지 파일
브리지 파일'ProjectName-Bridging-Header.h'는 다른 파일 을 처음 만 들 때 자동 으로 생 성 됩 니 다.실수 로 삭제 하면 수 동 으로 추가 할 수도 있 지만 이름 은"ProjectName-Bridging-Header.h"헤더 파일(이름 구성:프로젝트 이름-Bridging-Header.h)이 어야 합 니 다.이름 이 기억 나 지 않 으 면 직접 Header 파일 을 새로 만 든 후 Targets→Build Settings→Swift Compiler-Genel→Objective-C Bridging Header 에서 파일 경 로 를 설정 할 수 있 습 니 다.이 파일 은 주로 Swift 에서 OC 클래스 를 사용 할 때 사 용 됩 니 다.
2.Objective-C 생 성 된 인터페이스 헤더 이름 파일
이 파일 은 컴 파일 할 때 시스템 에서 생 성 된 Swift 파일 에 대응 하 는 Objective-C 의 헤더 파일 로,구체 적 으로 Targets→Build Settings→Swift Compiler-Genel→Objective-C Generated Interface Header Name 에서 설정 할 수 있 으 며,기본 파일 이름 은 프로젝트 이름-swift.h 로 변경 하지 않 습 니 다.
Objective-C 프로젝트 나 파일 에서 Swift 파일 을 사용 합 니 다.
OC 파일 에서 Swift 파일 의 클래스 를 호출 할 때 먼저 OC 파일 에\#import 를 추가 해 야 합 니 다."
ProjectName-swift.h"(이름 구성:프로젝트 이름-swift)
이 파일 은 프로젝트 에서 볼 수 없 지만 실제로 존재 합 니 다.컴 파일 한 후에 Command+이 파일 이름 을 누 르 면 구체 적 으로 생 성 된 코드 를 볼 수 있 습 니 다.
도입 후 구체 적 인 유형의 사용 은 OC 방식 으로 직접 사용 하면 된다.
Swift 프로젝트 나 파일 에 Objective-C 파일 사용 하기
Swift 에서 OC 파일 을 사용 할 때 는 브리지 파일 인 procject Name-Bridging-Header.h 파일 에 필요 한 헤더 파일 을 도입 하면 됩 니 다.
구체 적 으로 사용 하면 해당 하 는 Swift 문법 구조 에 따라 하면 된다.
혼합 편성 주의사항
혼합 편집 이 필요 한 Swift 클래스 에@obbc 성명 을 추가 하거나 NSObject 또는 NSObject 의 하위 클래스 를 계승 합 니 다.

 class TestClass {

//   

//   

}

Objective-C 클래스 에서 TestClass 클래스 를 사용 하려 면@obbc 를 사용 하여 설명 하거나 TestClass 를 NSObject 나 NSObject 의 하위 클래스 에 계승 해 야 합 니 다.그렇지 않 으 면 ProductName-swift.h 를 도입 한 후 프로그램 에서 대응 하 는 클래스 를 찾 을 수 없습니다.
제3자 프레임 워 크 사용
설정:target-->build setting-->Packaging-->Defines Module 은"Yes"입 니 다.
그리고 파일 Target->Build Phases->Link Binary 를 설정 하고 가 져 올 프레임 워 크 를 추가 합 니 다.
마지막 으로 abc-lib.framework 라 이브 러 리 의 abc.h 를 사용 하려 면 이렇게 설정 해 야 합 니 다.\#import"abc-lib/abc.h";
질문
사용자 정의 클래스 의 경우 Objective-C 의 클래스 는 Swift 의 클래스 를 계승 할 수 없습니다.즉,혼 편 될 OC 클래스 는 Swift 클래스 의 하위 클래스 가 될 수 없습니다.반대로 혼합 편성 이 필요 한 스 위 프 트 류 는 OC 의 클래스 를 계승 할 수 있다.주해
OC 매크로 파일
Swift 파일 이 OC 에서 정의 하 는 매크로 를 사용 하려 면 상수 간단 한 매크로 파일 만 사용 할 수 있 습 니 다.
Swift 만 의 특성
Swift 에는 많은 OC 에 없 는 특성 이 있 습 니 다.예 를 들 어 Swift 는 원 그룹,1 등 시민 을 위 한 함수,그리고 특유 의 매 거 진 유형 이 있 습 니 다.따라서 사용 할 혼합 파일 은 Swift 만 의 속성 문제 에 주의해 야 합 니 다.
사례 의 Swift 에서 OC 의 block 사용 하기
Swift 에서 Closure 를 사용 하면 Block 을 속성 으로 전송 할 수 없습니다.초기 화 방법 이나 함수 가 있어 야 합 니 다.
Objective-C 파일 중:

#import <UIKit/UIKit.h>

typedef void (^Myblock)(NSString *arg); 

@interface FirViewController : UIViewController 
//@property (copy, nonatomic) Myblock myBlock; 
//           ,   Swift       ,     。         ,        Block       

- (void)transValue:(Myblock) block;

@end

다음은 m 파일 입 니 다.

#import "FirViewController.h" 
@implementation FirViewController 

- (void)viewDidLoad 
{ 
  [super viewDidLoad]; 
  self.view.backgroundColor = [UIColor whiteColor]; 
} 

- (void)transValue:(Myblock)block
{ 
  if (block) 
  { 
    block(@"firBack"); 
  } 
} 
@end

Swift 파일 에서 리 셋:
Swift 에서 OC 클래스 를 사용 할 때 먼저 브리지 파일 에 oc 의 헤더 파일 을 설명 합 니 다.
프로젝트 이름-Bridging-Header.h Swift 프로젝트 를 만 든 경우

import UIKit 
class ViewController: UIViewController 
{ 
  override func viewDidLoad() 
  { 
    super.viewDidLoad() 
    self.view.backgroundColor = UIColor.whiteColor() 
  } 
  @IBOutlet weak var goFirst: UIButton! 
  @IBAction func goFirstAction(sender: AnyObject) 
  { 
    let firVC:FirViewController = FirViewController() 
    firVC. transValue { ( arg:String !) -> Void in 
      self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
    } 
    self.navigationController?.pushViewController(firVC, animated: true) 
}
스 위 프 트 와 오 브 젝 티 브-C 언어의 혼 편 이 이렇게 많이 공유 되 는데,신 께 서 소중 한 의견 을 주 셨 으 면 좋 겠 습 니 다!(짱!ε。@)
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기