OC和Swift混編遇到的一些小麻煩

一. 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: [])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章