OC和Swift混编遇到的一些小麻烦

2021-09-09  本文已影响0人  Sweet丶
一. OC中调用swift类中的方法时,编译器有时找不到方法声明
OC调用swift类中的方法,swift类需要有以下几个规则:
  1. swift类需要最终继承NSObjct, 并且类中提供给OC调用的方法需要添加@objc声明。
  2. @objc声明的方法可以是swift的对象方法,也可以是类型方法(包括static、class声明的方法)
  3. 使用@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()
    }
}
  1. 使用@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: [])
上一篇下一篇

猜你喜欢

热点阅读