Swift5.1 - oc到swift过渡
2019-08-29 本文已影响28人
HChase
条件编译
#if os(macOS) || os(iOS)
// 操作系统
#elseif arch(x86_64) || arch(arm64)
// 架构
#elseif swift(<3) || swift(>=5)
// swift版本号
#elseif targetEnvironment(simulator)
// 模拟器
#elseif canImport(Foundation)
// 是否能导入某个模块
#else
#endif
系统版本号检查
if #available(iOS 13, macOS 10.12, *) {
// .....
}
MARK、TODO、FIXME
swift调用oc
-
新建1个桥接头文件,文件名格式默认为:{targetName}-Bridging-Header.h
-
在 {targetName}-Bridging-Header.h 使用 #import "Person.h" 暴露给swift调用;
oc调用swift
-
Xcode 已经默认生成一个用于oc调用swift的头文件,文件名格式是{targetName}-Swift.h;
-
swift 暴露给oc的类最终继承NSObject;
-
使用@objc修饰的属性,是暴露给oc的成员;
-
使用@objcMembers修饰的类,是暴露给oc使用类
- 代表默认所有成员都会暴露给oc(包括扩展中定义的成员)
swift文件中定义:
@objcMembers class Cat: NSObject {
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
func eat() {
print("cat eat")
}
}
oc文件中调用:
#import "ocToSwift-Swift.h"
void test() {
Cat *cat = [[Cat alloc] initWithAge:10 name:@"xiaohei"];
[cat eat];
}
- 可以通过@objc来重命名暴露给oc的类名、属性名、方法;
swift文件中定义:
@objc(BYCat)
@objcMembers class Cat: NSObject {
var age: Int
@objc(color)
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
func eat() {
print("cat eat")
}
}
oc文件中调用:
#import "ocToSwift-Swift.h"
void test1() {
BYCat *cat = [[BYCat alloc] initWithAge:20 name:@"白色"];
cat.color = @"黑色";
}
选择器
- 在swift中,使用#selector(name)定义一个选择器;
- 必须被 @objcMembers 或 @objc 修饰的方法,才能定义选择器;
@objcMembers class Cat: NSObject {
func test1() { print("test1") }
func test2() { print("test2") }
func test() {
perform(#selector(test1))
}
}