OC和Swift混编遇到的一些小麻烦
2021-09-09 本文已影响0人
Sweet丶
一. OC中调用swift类中的方法时,编译器有时找不到方法声明
OC调用swift类中的方法,swift类需要有以下几个规则:
- swift类需要最终继承NSObjct, 并且类中提供给OC调用的方法需要添加
@objc
声明。 -
@objc
声明的方法可以是swift的对象方法,也可以是类型方法(包括static、class声明的方法) - 使用
@objc(methodName:)
给方法起别名时,括号中的就是OC调用时的方法名。具体如下:
extension UIImage {
///1. OC调用时方法名compressToByte:
@objc(compressToByte:) func compress(toByte maxLength: Int) -> Data? {
return Data()
}
///2. OC调用时方法名compress2ToByte:
@objc func compress2(toByte maxLength: Int) -> Data? {
return Data()
}
///3. OC调用时方法名compress3WithMaxLength:
///这里因为没有自定义参数标签toByte,所以编译器自动追加了with
@objc func compress3(maxLength: Int) -> Data? {
return Data()
}
}
- 使用
@objcMembers
标明一个继承自NSObject的swift类时,类中的方法都默认有@objc
的效果。
@objcMembers class Myclass : NSObject{
func test() {// OC可以调用test
}
static func testClassMethod(){// OC可以调用testClassMethod
}
}
二.CFRelease(source)
在swift
文件中,使用了C语言函数的create\copy\malloc
,不需要手动写CFRelease(source)、free()
之类的了。
三. 元组、枚举关联值、inout关键字在OC中不支持
在swift方法中如果参数或者返回值类型是OC中不支持的类型(元组、枚举关联值、inout关键字等),那么这个方法是不能与OC混编的。
四. do...try...catch
在OC中可以使用下面方式捕获系统调用方法时可能发生的异常:
// 保证只添加一次contentOffset观察
@try {// 1.首先会来到这里
[self.scrollView removeObserver:self forKeyPath:@"contentOffset"];
} @catch (NSException *exception) {// 2.如果发生异常会来到这里
NSLog(@"页面没有添加对scrollView.contentOffset的KVO观察");
} @finally {// 3.不管有没有发生异常,最终会来到这里
[self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];
}
在swift中调用有throws
关键字标明的方法时,需要捕获异常,方法如下:
// 方式一:do{ try ...} catch {}
do {
let data = try JSONSerialization.data(withJSONObject: dictionary, options: [])
} catch let error as NSError {
print(error)
}
// 方式二:try! 此方式调用方法时有异常时奔溃,无异常时是解包后的值
let data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
// 方式三: try? 此方式调用方法后返回值是可选类型,有异常时是nil
let data = try? JSONSerialization.data(withJSONObject: dictionary, options: [])