OC/Swift混編的一些小知識

  • Swift調(diào)用OC

橋接頭文件:

1.新建1個橋接頭文件,文件名格式默認(rèn)為:{targetName}-Bridging-Header.h
2.在{targetName}-Bridging-Header.h 文件中#import OC需要暴露給Swift的內(nèi)容
(可通過編譯器自動生成)

@_silgen_name關(guān)鍵字:

1.如果C語言暴露給Swift的函數(shù)名跟Swift中的其他函數(shù)名沖突了
2.可以在Swift中使用 @_silgen_name 修改C函數(shù)名(可以用此方法調(diào)用系統(tǒng)底層函數(shù))

// C語言
int sum(int a, int b) {
return a + b; }

// Swift
@_silgen_name("sum") 
func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32

print(swift_sum(10, 20)) // 30
print(sum(10, 20)) // 30
  • OC調(diào)用Swift

Xcode已經(jīng)默認(rèn)生成一個用于OC調(diào)用Swift的頭文件襟企,文件名格式是: {targetName}-Swift.h

  • Swift暴露給OC的類最終繼承自NSObject
  • 使用@objc修飾需要暴露給OC的成員
  • 使用@objcMembers修飾類
    • 代表默認(rèn)所有成員都會暴露給OC(包括擴展中定義的成員)
    • 最終是否成功暴露鹦牛,還需要考慮成員自身的訪問級別

@objc:

// 可以通過@objc 重命名Swift暴露給OC的符號名(類名、屬性名喳坠、函數(shù)名等)
@objc(MJCar)
@objcMembers class Car: NSObject {
    var price: Double
    @objc(name)
    var band: String
    init(price: Double, band: String) {
        self.price = price
        self.band = band 
    }
    @objc(drive)
    func run() { print(price, band, "run") } 
    static func run() { print("Car run") }
}
extension Car {
    @objc(exec:v2:)
    func test() { print(price, band, "test") } 
}

選擇器(Selector):

// Swift中依然可以使用選擇器构回,使用#selector(name)定義一個選擇器 
// 必須是被@objcMembers或@objc修飾的方法才可以定義選擇器
@objcMembers class Person: NSObject {
    func test1(v1: Int) { print("test1") }
    func test2(v1: Int, v2: Int) { print("test2(v1:v2:)") }
    func test2(_ v1: Double, _ v2: Double) { print("test2(_:_:)") } 
    func run() {
        perform(#selector(test1)) 
        perform(#selector(test1(v1:))) 
        perform(#selector(test2(v1:v2:))) 
        perform(#selector(test2(_:_:))) 
        perform(#selector(test2 as (Double, Double) -> Void))
    } 
}

dynamic
被 @objc dynamic 修飾的內(nèi)容會具有動態(tài)性谷炸,比如調(diào)用方法會走runtime那一套流程

class Dog: NSObject {
    @objc dynamic func test1() {}
    func test2() {}
}
var d = Dog() 
d.test1()
d.test2()
  • Swift語言中的一些編譯器特性:

代碼注釋相關(guān):

// MARK: 類似于OC中的 #pragma mark
// MARK: - 類似于OC中的 #pragma mark -
// TODO: 用于標(biāo)記未完成的任務(wù)
// FIXME: 用于標(biāo)記待修復(fù)的問題
#warning("undo")

條件編譯:

// 操作系統(tǒng):macOS\iOS\tvOS\watchOS\Linux\Android\Windows\FreeBSD #if os(macOS) || os(iOS)
// CPU架構(gòu):i386\x86_64\arm\arm64
#elseif arch(x86_64) || arch(arm64)
// swift版本
#elseif swift(<5) && swift(>=3)
// 模擬器
#elseif targetEnvironment(simulator) 
// 可以導(dǎo)入某模塊
#elseif canImport(Foundation)
#else
#endif  

系統(tǒng)版本檢測:

if #available(iOS 10, macOS 10.12, *) {
    // 對于iOS平臺陈惰,只在iOS10及以上版本執(zhí)行
    // 對于macOS平臺,只在macOS 10.12及以上版本執(zhí)行 // 最后的*表示在其他所有平臺都執(zhí)行
}

API可用性說明:

@available(iOS 10, macOS 10.15, *) 
class Person {}
struct Student {
    @available(*, unavailable, renamed: "study")
    func study_() {}
    func study() {}
    @available(iOS, deprecated: 11) 
    @available(macOS, deprecated: 10.12) 
    func run() {}
}

更多用法參考
自定義打印:

func logger<T>(_ msg: T,
                file: NSString = #file,
                line: Int = #line,
                  fn: String = #function) {
    #if DEBUG
    let prefix = "\(file.lastPathComponent)_\(line)_\(fn):" 
    print(prefix, msg)
    #endif
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毕籽,一起剝皮案震驚了整個濱河市抬闯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌关筒,老刑警劉巖溶握,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒸播,居然都是意外死亡睡榆,警方通過查閱死者的電腦和手機萍肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀屿,“玉大人塘揣,你說我怎么就攤上這事∷拚福” “怎么了亲铡?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葡兑。 經(jīng)常有香客問我奖蔓,道長,這世上最難降的妖魔是什么讹堤? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任吆鹤,我火速辦了婚禮,結(jié)果婚禮上洲守,老公的妹妹穿的比我還像新娘疑务。我一直安慰自己,他們只是感情好岖沛,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布暑始。 她就那樣靜靜地躺著,像睡著了一般婴削。 火紅的嫁衣襯著肌膚如雪廊镜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天唉俗,我揣著相機與錄音嗤朴,去河邊找鬼。 笑死虫溜,一個胖子當(dāng)著我的面吹牛雹姊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衡楞,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吱雏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘾境?” 一聲冷哼從身側(cè)響起歧杏,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迷守,沒想到半個月后犬绒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡兑凿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年凯力,在試婚紗的時候發(fā)現(xiàn)自己被綠了茵瘾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡咐鹤,死狀恐怖拗秘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慷暂,我是刑警寧澤聘殖,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站行瑞,受9級特大地震影響奸腺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜血久,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一突照、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氧吐,春花似錦讹蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翠拣,卻和暖如春版仔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背误墓。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工蛮粮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谜慌。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓然想,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欣范。 傳聞我的和親對象是個殘疾皇子变泄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容