Chi tiết: Dự án Objective-C với mã Swift 3 trong Xcode 8.1
Nhiệm vụ:
- Sử dụng enum nhanh chóng trong lớp object-c
- Sử dụng en-c enum trong lớp swift
MẪU ĐẦY ĐỦ
1. Lớp Objective-C sử dụng Swift enum
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
Phát hiện mã Swift trong mã Objective-C
Trong mẫu của tôi, tôi sử dụng SwiftCode.h để phát hiện mã Swift trong Objective-C. Tệp này tự động tạo (Tôi không tạo bản sao vật lý của tệp tiêu đề này trong dự án) và bạn chỉ có thể đặt tên của tệp này:
Nếu trình biên dịch không thể tìm thấy tệp tiêu đề Swift của bạn, hãy thử biên dịch dự án.
2. Lớp Swift sử dụng enive Objective-C
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
}
}
}
Phát hiện mã Objective-C trong mã Swift
Bạn cần tạo tập tin tiêu đề bắc cầu. Khi bạn thêm tệp Swift trong dự án Objective-C hoặc tệp Objective-C trong dự án nhanh, Xcode sẽ đề nghị bạn tạo tiêu đề bắc cầu.
Bạn có thể thay đổi tên tệp tiêu đề bắc cầu tại đây:
Cầu nối-Header.h
#import "ObjcClass.h"
Sử dụng
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
Kết quả
MẪU THÊM
Các bước tích hợp đầy đủ Objective-c và Swift được mô tả ở trên . Bây giờ tôi sẽ viết một số ví dụ mã khác.
3. Gọi lớp Swift từ mã Objective-c
Lớp học nhanh
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)")
}
}
Mã Objective-C (mã gọi)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
Kết quả
4. Gọi lớp Objective-c từ mã Swift
Lớp 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
Mã Swift (mã gọi)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
Kết quả
5. Sử dụng tiện ích mở rộng Swift trong mã Objective-c
Gia hạn Swift
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Mã Objective-C (mã gọi)
[UIView swiftExtensionFunc];
6. Sử dụng phần mở rộng Objective-c trong mã swift
Phần mở rộng 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
Mã Swift (mã gọi)
UIView.objcExtensionFunc()
YourProjectName-Swift.h
phải là một tệp tiêu đề kỳ diệu mà Xcode tự động tạo cho bạn trong quá trình biên dịch (bạn thực sự sẽ không thấy nó trong trình duyệt dự án). Hãy thử xóa cái bạn đã tạo và thêm#import YourProjectName-Swift.h
vào các tệp mà bạn muốn sử dụng các lớp Swift.