找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1591|回复: 0

越狱开发Swift之从C/ObjC调用Swift函数

[复制链接]

307

主题

228

回帖

7337

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5587 个
贡献
253 次
宅之契约
0 份
在线时间
948 小时
注册时间
2014-1-25
发表于 2021-8-6 12:46:31 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 元始天尊 于 2021-8-6 12:53 编辑

修饰符cdecl

  编译器会为当前swift函数增加wrapper函数,方便从C调用

修饰符objc

  注意,在ObjC类前和类方法前都要加该修饰符。编译器会为所有类方法增加wrapper方法,方便从ObjC调用

修饰符silgen_name

  编译器会直接将当前函数编译成C函数,在Swift中调用时也以C函数方式进行

@_cdecl("runoob0_cdecl")
func runoob0(i:Int) -> Int {
    return i+1;
}

@objc
class runoobcls:NSObject {
    @objc func runoob1(i:Int) -> Int {
        return i+1;
    }
}

@_silgen_name("runoob2_silgen") func runoob2(i:Int) -> Int {
    for i in [1...1000] {
        print(i)
    }
    return i+1;
}

// 从Swift调用
var ret1 = runoob0(i:0);
let g:runoobcls = runoobcls();
var ret2 = g.runoob1(i:1);
var ret3 = runoob2(i:2);
print("in swift \(ret1) \(ret2) \(ret3)")
// 从ObjC调用
extern int runoob0_cdecl(int);
int ret0 = runoob0_cdecl(10);
runoobcls* g = [[objc_getClass("testswift1.runoobcls") alloc] init];
int ret1 = [g runoob1WithI:11];
extern int runoob2_silgen(int);
int ret2 = runoob2_silgen(12);
NSLog(@"in c %d %d %d", ret0, ret1, ret2);

回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-20 18:54 , Processed in 0.036364 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表