一. 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: [])