OS程序的入口
- 在AppDelegate上面默认有一个@UIApplicationMain标记,这标识编译器自动生成入口代码(main函数代码),自动设置AppDelegate为APP的代理
- 也可以删掉@UIApplicationMain,自定义入口代码:新建一个main.swift文件
import UIKit
class MyApplication: UIApplication {}
UIApplicationMain(CommandLine.argc,
CommandLine.unsafeArgv,
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self))
Swift调用OC
- 新建一个桥接头文件,文件格式默认为:{targeName}-Bridging-Header.h
- 在纯swift代码中,创建一个OC类,会自动创建一个桥接头文件
- 在{targetName}-Bridging-Header.h 文件中 #import OC需要暴露被Swift的内容

Swift调用OC - @_silgen_name
- 如果C语言暴露给Swift的函数名跟Swift中的其他函数名冲突了
- 可以在Swift中使用@_silgen_name 修改C函数名
// C语言
int sum(int a, int b) {
return a + b;
}
// Swift
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
- 直接#import “{targetName}-Swift.h”

OC调用Swift - @objc
- 可以通过@objc 重命名Swift暴露给OC的符号名(类名、属性名、函数名等)
- 需要暴露给OC的类,必须继承NSObject
@objc(MyCar)
@objcMembers class Car: NSObject {
var price: Double
@objc(name)
var band: String
init(price: Double, band: String) {
self.price = price
self.band = band
}
@objc(drive)
func run() { print(price, band, "run")}
static func run() {print("Car run")}
}
extension Car {
@objc(exec:v2:) // 虽然改成传递两个参数,但是test函数中是拿不到这个两个参数的
func test() { print(price, band, "test") }
}
var car = Car(price: 10.5, band:"Audi")
car.run() // 调用方式,走虚表;如果想让方法走objc_msgSend,用dynamic修饰方法名
MyCar *c = [[MyCar alloc] initWithPrice:10.5 band:@"BMW"];
c.name = @"Bently";
c.price = 108.5;
[c drive]; // 108.5 Bently test
[c exec:10 v2: 20]; // 108.5 Bently test
[MyCar run]; // Car run
选择器(Selector)
- Swift中依然可以使用选择器,使用#selector(name)定义一个选择器
- 必须是呗@objcMembers或@objc修饰的方法才可以定义选择器
@objcMembers class Person: NSObject {
func test1(v1: Int) { print("test1") }
func test2(v1: Int, v2: Int) { print("test2(v1:v2:)") }
func test2(_ v1: Double, _ v2: Double) { print("test2(_:_:)") }
runc run() {
perform(#selector(test1))
perform(#selector(test1(v1:)))
perform(#selector(test2(v1:v2:)))
perform(#selector(test2(_:_:)))
perform(#selector(test2 as (Double, Double) -> Void))
}
}
来源:https://blog.csdn.net/songzhuo1991/article/details/100981330

