Private 權(quán)限控制
Swift3中,如果將主體函數(shù)的變量定義為private攘残,則其extension無(wú)法讀取此變量讨惩,必須將其改為filePrivate才可以,但是權(quán)限又被擴(kuò)大了氏身。在Swift4中巍棱,private變量也可以被其extension讀取。
Swift3.0時(shí)Private權(quán)限
Swift4.0時(shí)Private權(quán)限
類和接口的組合語(yǔ)法支持
Swift4.0中泛型支持類和接口的組合
類和接口的組合
編譯相關(guān)
加快了編譯速度
- Swift3.2可以和Swift4進(jìn)行共存蛋欣,并在XCode中提供版本選擇
- 提前編譯Swift-OC Bridge航徙,加快速度
- 不再單獨(dú)進(jìn)行Indexing,每次編譯時(shí)會(huì)自動(dòng)index
- 在Size方面自動(dòng)過(guò)濾掉不用的代碼陷虎,減少體積
- 可以選擇 "Strip Swift Symbol"來(lái)達(dá)到減少編譯后的體積
減少Swift暴露給OC的接口
在之前的Swift 版本中到踏,所有繼承自NSObject的類的屬性和方法都會(huì)被默認(rèn)加上@objc標(biāo)識(shí),以便將其暴露給Objective-C尚猿,編譯器會(huì)為這些方法和屬性生成可供OC調(diào)用的代碼夭禽,但是實(shí)際情況可能只有很少量的幾個(gè)方法需要暴露給OC,這就造成很大的空間浪費(fèi)谊路。因此在Swift 4中讹躯,編譯器大部分情況下不會(huì)自動(dòng)添加@objc標(biāo)識(shí),如果要暴露給OC缠劝,需要手動(dòng)添加潮梯。
Before Swift 4, the compiler made some Swift declarations automatically available to Objective-C. For example, if one subclassed from NSObject, the compiler created Objective-C entry points for all methods in such classes. The mechanism is called @objc inference.
In Swift 4, such automatic @objc inference is deprecated because it is costly to generate all those Objective-C entry points. When "Swift 3 @objc Inference" setting is set to "On", it allows the old code to work. However, it will show deprecation warnings that need to be addressed. It is recommended to "fix" these warnings and switch the setting to "Off", which is the default for new Swift projects.
可以通過(guò)以上設(shè)置開(kāi)啟/關(guān)閉Swift3的 @objc推斷
String相關(guān)
- Multi-line string literals 多行字符串字面量
編譯器自動(dòng)給每行前面添加換行符號(hào)
- String本身是character的集合(Collection)
所以可以把String當(dāng)Collection進(jìn)行操作
屏幕快照 2017-07-02 上午11.36.07.png
- 新增類型Substring
對(duì)String進(jìn)行substring等操作會(huì)得到一個(gè)類型為Substring的字符串。Substring跟String很類似惨恭,他們都實(shí)現(xiàn)了StringProtocol秉馏。
在 Swift 中,String 的背后有個(gè) Owner Object 來(lái)跟蹤和管理這個(gè) String脱羡,String 對(duì)象在內(nèi)存中的存儲(chǔ)由內(nèi)存起始地址萝究、字符數(shù)免都、指向 Owner Object 指針組成。Owner Object 指針指向 Owner Object 對(duì)象帆竹,Owner Object 對(duì)象持有 String Buffer绕娘。當(dāng)對(duì) String 做取子字符串操作時(shí),子字符串的 Owner Object 指針會(huì)和原字符串指向同一個(gè)對(duì)象栽连,因此子字符串的 Owner Object 會(huì)持有原 String 的 Buffer险领。當(dāng)原字符串銷毀時(shí),由于原字符串的 Buffer 被子字符串的 Owner Object 持有了秒紧,原字符串 Buffer 并不會(huì)釋放绢陌,造成極大的內(nèi)存浪費(fèi)。
在 Swift 4 中熔恢,做取子串操作的結(jié)果是一個(gè) Substring 類型脐湾,它無(wú)法直接賦值給需要 String 類型的地方。必須用 String(<substring>) 包一層叙淌,系統(tǒng)會(huì)通過(guò)復(fù)制創(chuàng)建出一個(gè)新的字符串對(duì)象秤掌,這樣原字符串在銷毀時(shí),原字符串的 Buffer 就可以完全釋放了凿菩。
屏幕快照 2017-07-02 上午11.37.53.png
- Unicode
改善了在計(jì)算Unicode字符長(zhǎng)度時(shí)的正確性
在 Unicode 中机杜,有些字符是由幾個(gè)其它字符組成的,比如 é 這個(gè)字符衅谷,它可以用 \u{E9} 來(lái)表示
屏幕快照 2017-07-02 上午11.39.04.png
Associated type constraints 關(guān)聯(lián)類型約束
- protocol中也可以使用where語(yǔ)句對(duì)關(guān)聯(lián)類型進(jìn)行約束了
protocol SomeProtocol where Self: UICollectionViewCell {
}
- Sequence協(xié)議有自己的Element associatedtype了椒拗,不需要寫Iterator.Element了
extension Sequence where Element: Numeric {
var sum: Element {
var result: Element = 0
for element in self {
result += element
}
return result
}
}
[1,2,3,4].sum
強(qiáng)制要求對(duì)內(nèi)存變量的訪問(wèn)具有互斥性
例如,在遍歷一個(gè)數(shù)組的過(guò)程中如果同時(shí)在循環(huán)內(nèi)對(duì)數(shù)組進(jìn)行數(shù)據(jù)操作获黔,會(huì)在編譯時(shí)報(bào)錯(cuò)蚀苛。
屏幕快照 2017-07-02 上午11.43.42.png
屏幕快照 2017-07-02 上午11.43.42.png