【iOS】OC Swift混编

OC Swift混编

iOS程序的入口

  • AppDelegate上面默认有个 @main 标记,这表示
    • 编译器自动生成入口代码(main函数代码), 自动设置AppDelegate为APP的代理
  • 也可以删掉 @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版权协议,转载请附上原文出处链接和本声明。