更新時間: 2018-6-6
WWDC2018 在昨天(6.5)凌晨開幕了, 本次大會主要針對 iOS、macOS、tvOS、watchOS 平臺。作為開發者, 第一時間關注的是技術的更新。 昨天就升級到 iOS12 以及在 Mojave 上使用 Xcode10。 這段時間會陸陸續續更新。 這篇文章是關於昨晚的 What's new in Swift
值得一說: Swift5 得等2019年咯
Faster Swift Debug Builds
Xcode10 給人的第一印象就是 Build Faster,
官方的圖片顯示
在我實際測試之中, 編譯速度真的提升很多。以前專案完全編譯的情況需要大概10-20多分鐘,這次僅僅花了4分多。而且遷移到 Swift4.2 幾乎沒有任何障礙。
Xcode10 增加了編譯模式(Copilation Mode) 和 優化水平(Optimization Level)
編譯模式(Copilation Mode):
- 增量更新(Incremental)
- 全量更新(Whole Module)
優化水平(Optimization Level):
- No optimization[-Onone]
- Optimize for Speed[-O]
- Optimize for Size[-Osize]
值得提一下的是: 如果你的 Optimization Level
設定為 Optimize for Size[-Osize]
, 程式碼體積減少10%~30%, 這樣的代價就是 執行時效能降低5%左右
Small String
字串的大小將變得更小小了, 在64位機器上, 字串的編碼使用16 bytes
語言新特性(New Language Features)
Swift 每個版本的新特性, 開發者可以通過 Github 或者 Swift Evolution 檢視
1. 列舉集合(Derived Collection of Enum Cases)
在 Swift4.2之前, 我們遍歷列舉值需要這樣做
enum Gait {
case walk
case trot
case canter
case gallop
// 定義一個集合來儲存所有的情況
static var allCases: [Gait] = [.walk, .trot, .canter, .gallop]
}
for gait in Gait.allCases {
print(gait)
}
複製程式碼
如果我們新增、刪除或者修改了一個 case
, 就需要在 allCases
進行對應的操作, 很麻煩。
Swift 4.2 新增了 CaseIterable
可以實現 allCases
效果。
enum Gait: CaseIterable {
case walk
case trot
case canter
case gallop
}
for gait in Gait.allCases {
print(gait)
}
複製程式碼
延伸閱讀: Handling Future Enum Cases
2. 條件一致性(Conditional conformances)
在 Swift 4.2 之前
Swift 4.2 之後, 可以對集合內的元素進行比較
let coins = [[1, 2], [3, 6], [4, 12]]
coins.contains([3, 6]) // true
複製程式碼
官方視訊中列出了這幾種情況:
// Equatable
extension Optional: Equatable where Wrapped: Equatable {}
extension Array: Equatable where Element: Equatable {}
extension Dictionary: Equatable where Dictionary: Equatable {}
// Hashable
extension Optional: Hashable where Wrapped: Hashable {}
extension Array: Hashable where Element: Hashable {}
extension Dictionary: Hashable where Dictionary: Hashable {}
// Encodable
extension Optional: Encodable where Wrapped: Encodable {}
extension Array: Encodable where Element: Encodable {}
extension Dictionary: Encodable where Dictionary: Encodable {}
// Decodable
extension Optional: Decodable where Wrapped: Decodable {}
extension Array: Decodable where Element: Decodable {}
extension Dictionary: Decodable where Dictionary: Decodable {}
複製程式碼
還有一個比較有意思的情況是: 條件一致性允許組合(Conditional conformances allow composition)
// Int is Hashable
// => Int? is Hashable
// => [Int?] is Hashable
複製程式碼
3. Syntheszed Equatable and Hashable
這個新特性是在 Swift 4.1中實現的。
在 Swift4.1 之前, 如果要比較兩個物件, 最簡單的方式是遵循 Equatable
協議, 然後實現協議定義的方法.
struct Person: Equatable {
var name: String
var age: Int
}
func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
複製程式碼
實際上 func == (lhs: Person, rhs: Person) -> Bool {}
在不同物件中, 都需要來實現。
在 Swift 4.1 之後,如果物件 儲存型的屬性
都是 Equatable
, 並且 物件是 Equatable
, 系統預設會為你實現 func == (lhs: Person, rhs: Person) -> Bool {}
這個方法, 物件屬性進行一個個比較。
這種操作對 Hashable
也是合適的。 如果你的儲存型屬性是 Hashable
, 系統會預設為你實現 public var hashValue: Int { get }
struct Person: Equatable, Hashable {
var name: String
var age: Int
}
let p1 = Person(name: "xiaoming", age: 12)
let p2 = Person(name: "xiaoming", age: 12)
let p3 = Person(name: "xiaohong", age: 12)
let p4 = Person(name: "xiaoming", age: 15)
print(p1 == p2) // true
print(p1 == p3) // false
print(p3 == p4) // false
print(p1.hashValue == p2.hashValue) // true
print(p1.hashValue == p3.hashValue) // false
print(p3.hashValue == p4.hashValue) // false
print(p1.name.hashValue == p2.name.hashValue) // true
print(p1.age.hashValue == p3.age.hashValue) // true
print(p1.name.hashValue == p4.name.hashValue) // true
複製程式碼
4. 雜湊增強(Hashable Enhancements)
Hashable
協議新增了一個方法
public protocol Hashable : Equatable {
public var hashValue: Int { get }
public func hash(into hasher: inout Hasher)
}
複製程式碼
5.Random Number Generation
Github連結 [Swift Evolution連結]( https://apple.github.io/swift-evolution/#?search=0202
6.Adding a build configuration INport Test
7.Target environment platform condition
8. Implicitly Unwrapped Optionals
9. Enforcing Exclusive Access to Memory
Swift 語言的新特性其實都在 https://apple.github.io/swift-evolution/ 有列出, 開發者可以點選進去檢視原文.