OC Swift混编
iOS程序的入口
- 在
AppDelegate
上面默认有个@main
标记,这表示- 编译器自动生成入口代码(main函数代码), 自动设置
AppDelegate
为APP的代理
- 编译器自动生成入口代码(main函数代码), 自动设置
- 也可以删掉
@main
,自定义入口代码:新建一个main.swift文件
import Foundation
import UIKit
class AYApplication: UIApplication {}
UIApplicationMain(CommandLine.argc,
CommandLine.unsafeArgv,
NSStringFromClass(AYApplication.self),
NSStringFromClass(AppDelegate.self))
Swift调用OC
- 新建1个桥接头文件, 文件名格式默认为:
{targetName}-Bridging-Header.h
- 在
{targetName}-Bridging-Header.h
文件中 #import OC需要暴露给Swift的内容
#import "AYPerson.h"
@_silgen_name
- 如果C语言暴露给Swift的函数名跟Swift中的其他函数名冲突了
- 可以在Swift中使用@_silgen_name修改C函数名
//C语言
int sum(int a, int b) {
return a + b;
}
//Swift
@_silgen_name("sum") func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32
print(swift_sum(10, 20)) // 30
print(sum(10, 20)) // 30
OC调用Swift
Xcode已经默认生成一个用于OC调用Swift的头文件, 文件名是:
{targetName}-Swift.h
Swift暴露给OC的类最终继承自
NSObject
使用
@objc
修饰需要暴露给OC的成员使用
objcMembers
修饰类- 代表默认所有成员都会暴露给OC (包括扩展中定义的成员)
- 最终是否成功暴露,还需要考虑成员自身的访问级别
Xcode会根据Swift代码生成对应的OC声明,写入
{targetName}-Swift.h
文件可以通过
@objc
重命名Swift暴露给OC的符号名(类名、属性名、函数名等)
选择器(Selector)
- Swift中依然可以使用选择器,使用
#selector(name)
定义一个选择器- 必须是被
objcMembers
或@objc
修饰的方法才可以定义选择器
- 必须是被
版权声明:本文为weixin_43861113原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。