
目錄
一,條件編譯
二,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中定義的
-
OC和Swift調(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
-
NSString和String可以用as直接互相轉(zhuǎn)換 -
NSMutableString可以用as轉(zhuǎn)換為String,反之則不可以


六,多線程
1,異步

2,延遲

3,once
-
dispatch_once在Swift中已被廢棄 - 可以用類型屬性或者全局變量/常量來實(shí)現(xiàn)
- 默認(rèn)自帶
lazy+dispatch_once的效果


4,加鎖
