Swift:與OC混編

目錄
一,條件編譯
二,KVO/KVC
三,Swift調(diào)用OC
四,OC調(diào)用Swift
五,字符串
六,多線程

一,條件編譯

1,代碼標(biāo)記
2,條件編譯
3,信息打印
4,版本檢測
5,API可用性
6,程序入口

二,KVO/KVC

1,選擇器
  • 必須是被@objcMembers@objc修飾的方法才可以定義選擇器
2,協(xié)議可選方法
  • 可以用@objc將方法定義為可選的,這種協(xié)議只能被類遵守
3,dynamic
  • dynamic修飾的內(nèi)容具有動(dòng)態(tài)性,比如:調(diào)用方法會走runtime消息發(fā)送流程
4,KVO/KVC
  • Swift支持KVO/KVC的條件:
  • 屬性所在的類、監(jiān)聽器最終繼承自NSObject
  • dynamic修飾對應(yīng)的屬性
5,關(guān)聯(lián)對象
  • 默認(rèn)情況下,在extension中不可以添加存儲屬性
6,資源名管理

三,Swift調(diào)用OC

1,條件
  • 新建一個(gè)橋接頭文件,文件名格式默認(rèn)為:{targetName}-Bridging-Header.h
  • 在頭文件中#import需要暴露給Swift使用的文件
2,OC代碼
3,Swift代碼
4,修改函數(shù)名
  • 如果C語言暴露給Swift的函數(shù)名跟Swift中其他的函數(shù)名沖突了,可以在Swift中使用@_silgen_name修改C語言的函數(shù)名

四,OC調(diào)用Swift

1,條件
  • Xcode默認(rèn)生成了一個(gè)用于OC調(diào)用Swift的頭文件,文件名格式是:{targetName}-Swift.h
  • Xcode會根據(jù)Swift代碼生成對應(yīng)的OC聲明,并寫入該頭文件中
2,Swift代碼
  • 暴露給OC的類需要最終繼承自NSObject
  • 使用@objc修飾需要暴露給OC的成員
  • 如果想要所有成員都暴露給OC,就使用@objcMembers來修飾類
3,OC代碼
4,修改符號名
  • 可以通過@objc重命名暴露給OC的符號名(類名、屬性名、方法名等)
5,調(diào)用方法
  • 暴露給OC的類為何需要繼承自NSObject?

OC調(diào)用方法會走消息發(fā)送流程,消息發(fā)送流程需要用到isa指針,而isa指針是在NSObject中定義的

  • OCSwift調(diào)用方法的區(qū)別?

OC調(diào)用方法是走消息發(fā)送流程,不論是OC調(diào)用Swift方法,還是Swift調(diào)用OC方法;Swift調(diào)用方法是用虛表來實(shí)現(xiàn)的

五,字符串

1,String
  • 基本使用
  • 插入刪除
  • 多行
2,Substring
  • 子串類型不是String,而是Substring
  • Substring和它的base,共享一份數(shù)據(jù)
  • Substring發(fā)生修改或者轉(zhuǎn)為String時(shí),才會分配新的內(nèi)存
3,Character
4,NSString
  • NSStringString可以用as直接互相轉(zhuǎn)換
  • NSMutableString可以用as轉(zhuǎn)換為String,反之則不可以

六,多線程

1,異步
2,延遲
3,once
  • dispatch_onceSwift中已被廢棄
  • 可以用類型屬性或者全局變量/常量來實(shí)現(xiàn)
  • 默認(rèn)自帶lazy + dispatch_once的效果
4,加鎖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容