세부 사항 : Xcode 8.1에서 Swift 3 코드가있는 Objective-C 프로젝트
작업 :
- objective-c 클래스에서 swift enum 사용
- 신속한 클래스에서 objective-c enum 사용
전체 샘플
1. Swift 열거 형을 사용하는 Objective-C 클래스
ObjcClass.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ObjcEnum) {
ObjcEnumValue1,
ObjcEnumValue2,
ObjcEnumValue3
};
@interface ObjcClass : NSObject
+ (void) PrintEnumValues;
@end
ObjcClass.m
#import "ObjcClass.h"
#import "SwiftCode.h"
@implementation ObjcClass
+ (void) PrintEnumValues {
[self PrintEnumValue:SwiftEnumValue1];
[self PrintEnumValue:SwiftEnumValue2];
[self PrintEnumValue:SwiftEnumValue3];
}
+ (void) PrintEnumValue:(SwiftEnum) value {
switch (value) {
case SwiftEnumValue1:
NSLog(@"-- SwiftEnum: SwiftEnumValue1");
break;
case SwiftEnumValue2:
case SwiftEnumValue3:
NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
break;
}
}
@end
Objective-C 코드에서 스위프트 코드 감지
내 샘플에서는 SwiftCode.h를 사용하여 Objective-C에서 Swift 코드를 감지합니다. 이 파일은 자동으로 생성되며 (프로젝트에서이 헤더 파일의 실제 복사본을 만들지 않았습니다)이 파일의 이름 만 설정할 수 있습니다.
컴파일러가 헤더 파일 Swift 코드를 찾을 수 없으면 프로젝트를 컴파일하십시오.
Objective-C 열거 형을 사용하는 Swift 클래스
import Foundation
@objc
enum SwiftEnum: Int {
case Value1, Value2, Value3
}
@objc
class SwiftClass: NSObject {
class func PrintEnumValues() {
PrintEnumValue(.Value1)
PrintEnumValue(.Value2)
PrintEnumValue(.Value3)
}
class func PrintEnumValue(value: ObjcEnum) {
switch value {
case .Value1, .Value2:
NSLog("-- ObjcEnum: int value = \(value.rawValue)")
case .Value3:
NSLog("-- ObjcEnum: Value3")
break
}
}
}
Swift 코드에서 Objective-C 코드 감지
브리징 헤더 파일을 만들어야합니다. Objective-C 프로젝트에 Swift 파일을 추가하거나 신속한 프로젝트에 Objective-C 파일을 추가하면 Xcode에서 브리징 헤더를 생성하도록 제안합니다.
여기에서 브리징 헤더 파일 이름을 변경할 수 있습니다.
브리징 헤더 .h
#import "ObjcClass.h"
용법
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
결과
더 많은 샘플
전체 통합은 목표 - C 단계와 스위프트는 전술 . 이제 다른 코드 예제를 작성하겠습니다.
3. Objective-c 코드에서 Swift 클래스 호출
스위프트 클래스
import Foundation
@objc
class SwiftClass:NSObject {
private var _stringValue: String
var stringValue: String {
get {
print("SwiftClass get stringValue")
return _stringValue
}
set {
print("SwiftClass set stringValue = \(newValue)")
_stringValue = newValue
}
}
init (stringValue: String) {
print("SwiftClass init(String)")
_stringValue = stringValue
}
func printValue() {
print("SwiftClass printValue()")
print("stringValue = \(_stringValue)")
}
}
Objective-C 코드 (호출 코드)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
결과
4. 스위프트 코드에서 Objective-c 클래스 호출
Objective-C 클래스 (ObjcClass.h)
#import <Foundation/Foundation.h>
@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end
ObjcClass.m
#import "ObjcClass.h"
@interface ObjcClass()
@property NSString* strValue;
@end
@implementation ObjcClass
- (instancetype) initWithStringValue:(NSString*)stringValue {
NSLog(@"ObjcClass initWithStringValue");
_strValue = stringValue;
return self;
}
- (void) printValue {
NSLog(@"ObjcClass printValue");
NSLog(@"stringValue = %@", _strValue);
}
- (NSString*) stringValue {
NSLog(@"ObjcClass get stringValue");
return _strValue;
}
- (void) setStringValue:(NSString*)newValue {
NSLog(@"ObjcClass set stringValue = %@", newValue);
_strValue = newValue;
}
@end
스위프트 코드 (호출 코드)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
결과
5. Objective-c 코드에서 Swift 확장 사용
스위프트 확장
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Objective-C 코드 (호출 코드)
[UIView swiftExtensionFunc];
6. 신속한 코드에서 Objective-c 확장 사용
Objective-C 확장 (UIViewExtension.h)
#import <UIKit/UIKit.h>
@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end
UIViewExtension.m
@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
NSLog(@"UIView objcExtensionFunc");
}
@end
스위프트 코드 (호출 코드)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
컴파일하는 동안 Xcode가 자동으로 생성하는 마법의 헤더 파일이어야합니다 (실제로는 프로젝트 브라우저에 표시되지 않음). 작성한 것을 삭제하고#import YourProjectName-Swift.h
Swift 클래스를 사용하려는 파일에 추가하십시오 .