皇冠新体育APP

IT技术之家

Swift和OC混编-1_yokan_de_s

更新时光:2023-08-24 16:37:56 iOS 55次 标签:
现在的框架还是OC的比较多,虽然大部分都支持了Swift一旦遇到只支持OC的,还是需要用Swift调用OC,相反如果遇到一个OC的老模块不能使用了,那么编写一个新的Swift模块,也同时需要OC调用SwiftSwift调用OC在Swift项目里面创建OC会提示需不需要生成桥接文件,一般是默认生成会多一个targetname-Bridging-Header.h这样的一个桥接文件*****如果不小心点到了Don‘t Create也没事(正常情况是默认生成不用手动去弄)1.创建一个he...

现代的框架图更是OC的特别多,虽大部位都能够了Swift当碰见只能够OC的,更是需求用Swift获取OC,反向假设碰见是其中一个OC的老信息模块电源可以食用了,那 撰写是其中一个新的Swift信息模块电源,也一同需求OC获取Swift

Swift调用OC

在Swift创业项目面开启OC会显示信息需不都要生产二维码桥接文件夹,基本上是设置生产二维码

会多1个targetname-Bridging-Header.h这样一来的1个桥接zip文件

*****如果不小心点到了Don‘t Create也没事(正常情况是默认生成不用手动去弄)

1.创立个header.h,简称都是新好项目名-Bridging-Header.h这种我在这个新好项目叫test,特别都是test-Bridging-Header.h

2.在building setting里面添加这个文件的路径?

3.在头文档文件之中读取数据要想的.h譬如,要装Person.h就#import "Person.h"
@interface Person : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) int age;
@end
搭建个Person类,定议个name攻击速度,个age攻击速度

如果就可能在main.swift底下起始化跳转了
var p = Person()
print(p.name)   //空字符串
print(p.age)   //0
可不可以看自定义页的混编,Swift获取OC的类,会自定义页导出值,词有Int会自定义页为0,name会自定义页为空字段串 .h写上
-(instancetype)initWithName:(NSString *)name age:(int)age;
.m写上
-(instancetype)initWithName:(NSString *)name age:(int)age
{
    if (self = [super init]) {
        self.name = name;
        self.age = age;
    }
    return self;
}
var p = Person(name: "yk", age: 120)
就能通常的起始化了,比较适合特别注意的是,在此的Int是Int32而不会是64 倘若把默认化设置成返回了nil
-(instancetype)initWithName:(NSString *)name age:(int)age
{
//    if (self = [super init]) {
//        self.name = name;
//        self.age = age;
//    }
    return nil;
}
那麼不怕怎们赋值都不怎么也会有作用了
var p = Person(name: "yk", age: 120)
print(p.name)   //空字符串
print(p.age)   //0
p.name = "yk"
p.age = 10
print(p.name)   //空字符串
print(p.age)   //0
赋值函数值并不会起反响,因为装得了很好象框架做个供选择项的操作,而是并不根本不一样

函数冲突和类名冲突

比如指数函数值和类名不兼容,优先权取用Swift自己准备的指数函数值和类 我希望有这样个场景设计,OC是其次方库,变量名没办法改,Swift也没办法修订,但又一定都会进行OC的变量 Swift 的函数值是:
func sum(_ a:Int,_ b:Int) -> Int {
    a - b
}
OC的函数公式是:
int sum(int a,int b)
{
    return a + b;
}
这5个涵数取用方法那样,机系统会自定义取用Swift的涵数
@_silgen_name("sum")
func newSum(_ a:Int32,_ b:Int32) -> Int32
print(sum(10, 20))  // -10
print(newSum(10, 20))  //30
倘若肯定程度要启用OC的数学方程可给OC数学方程立即排列顺序名,准备这些的Int肯定程度要转型为Int32

OC调用Swift

Swift的代码是什么希望给OC用不得不继续NSObject
@objcMembers class Person :NSObject {
    var name:String
    var age:Int
    init(name:String,age:Int) {
        self.name = name
        self.age = age
    }
}
如这里Person类 但是还是要倒入头文书target-swift.h 在这其中target也是工程名,打比方我得还是test-swift.h ********要留意,一定的要编译,不编译是会刷新页面test-swift.h文件资料的
void ptr()
{
    Person *person = [[Person alloc] initWithName:@"yk" age:10];
    person.name = @"tk";
    person.age = 20;
    NSLog(@"%@,%d",person.name,person.age); //2021-05-21 19:08:03.396944+0800 test[1965:162612] tk,20
}
第二步就能正常人的在OC中间读取Swift了

@objc关键字

适用显示名
@objc(YKPerson)
@objcMembers class Person :NSObject {
    var name:String
    var age:Int
    init(name:String,age:Int) {
        self.name = name
        self.age = age
    }
}
ptr()
这种为了能迎合了OC的菜系,我也写了YKPerson
void ptr()
{
    YKPerson *person = [[YKPerson alloc] initWithName:@"yk" age:10];
    person.name = @"tk";
    person.age = 20;
    NSLog(@"%@,%d",person.name,person.age); //2021-05-21 19:08:03.396944+0800 test[1965:162612] tk,20
}
这也得跟改