//
// TestSwift.swift
// OCBaseProject
//
// Created by Alisa on 2022/4/21.
//
import Foundation
import UIKit
@objc(TestSwift) //这样加入 @objc了在oc的.h、.m中才可以看得见这个类
//注意:想要被oc调用,swift的类要继承与NSOject,否则会报错,Only classes that inherit from NSObject can be declared @objc
class TestSwift:NSObject, OCTestDelegate{
//注意:类中的属性/方法想要被oc的文件看见,就都要用 @objc关键字去修饰
@objc var day:String = ""
@objc var time:Int = 0
@objc func swiftMethod(){
print("This is a swift Method!")
print("current day = \(self.day), time = \(self.time)")
}
//swift文件中调用oc的代码
@objc func takeOcMethod(){
//创建oc的类
let oc = OCTest()
//给oc的属性赋值
oc.name = "Alisa"
//调用oc的方法
oc.ocMethod("This is in Test Swift Code!")
//设置oc中的代理
oc.delegate = self
}
//实现oc类的协议
//注意:如果协议中的方法不是optional,默认swift会认为是required,这里就必须实现required修饰的所有协议方法,否则报错,而不是警告
func ocTestFileDelegateMethod() {
print("This is ocTestFileDelegateMethod protocol method in swift code")
}
}
创建一个供Swift使用的OC类,如下:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol OCTestDelegate <NSObject>
-(void)ocTestFileDelegateMethod;
@optional
-(void)ocTestFileDelegateMethodOptional;
@end
@interface OCTest : NSObject
@property(nonatomic, strong)NSString * name;
@property(nonatomic, weak)id<OCTestDelegate>delegate;
-(void)ocMethod:(NSString *)message;
@end
#import "OCTest.h"
@implementation OCTest
-(void)ocMethod:(NSString *)message
{
NSLog(@"This is a objective-c method!");
NSLog(@"The swift message is: %@", message);
NSLog(@"Current name is: %@", self.name);
//调用自己的代理方法,在swift中执行
[self.delegate ocTestFileDelegateMethod];
}
@end
Swift调用OC的代码:
//swift调用oc
-(void)swiftTakeOcCode
{
TestSwift * ts = [[TestSwift alloc] init];
ts.day = @"Friday";
ts.time = 9;
//swift 调用oc的入口
[ts takeOcMethod];
/* 打印信息
This is a objective-c method!
The swift message is: This is in Test Swift Code!
Current name is: Alisa
*/
}
OC调用Swift:
//oc调用swift
-(void)takeSwiftMethod
{
//创建Swift类
TestSwift* ts = [[TestSwift alloc] init];
//调用Swift类的属性
ts.day = [NSString stringWithFormat:@"Thursday"];
ts.time = 11;
//调用Swift类的方法
[ts swiftMethod];
/* 打印信息
This is a swift Method!
current day = Thursday, time = 11
*/
}
写在最后的环境配置:
当在OC的工程中建立一个Swift文件时,会提示是否建立一个Bridging-Header,勾选上,整个工程只需要建立一个,混编时如果需要Swift能看得到的OC头文件,在Bridging-Header中import一下就可以了,当我们在OC中想要使用Swift则在.h/.m中import一下Bridging-Header.h,下面为OC混编工程的OCBaseProject-Bridging-Header.h中的代码
#import "OCTest.h"
#import "OCTestProtocol.h"
#import "SwiftUseOcProtocol.h"
#import "OcCategoryBase.h"
#import "OcCategoryBase+More.h"
#import "OcBlockBase.h"