Swift与OC混编之函数与属性的互相调用

//
//  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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值