1 增加了# 符号,使字符串更加简单
1. 在字符串中包含“时不必添加\
2 .包含\反斜杠也不需要再加转义符,直接前后加#号即可
3. 当字符串包含#时,前后应用##包裹字符串
4. 用#“”“”开头""""#结尾来表示多行字符串
正则表达式中因为不用反斜杠转义,使得正则表达式更加简洁明了
2 在枚举中新增加了一个@unknow 修饰default分支,使得enum中的中增加case的时候,编译器会在该enum后面加警告
3 integers新增加了一个isMultiple(of:)方法用来检测一个数是另外一个数的倍数
4 数组增加了一个count(where:)相当于filter()+count的结果,使他更加简洁一步到位 let scores = [100,80,85]
let passCount = scores.filter{($0 >= 85)}.count
//after 避免生成一个数组
let scores = [100,80,85]
let passCount = scores.count { $0 >= 85}
5 字典增加了一个方法compactMapValues()方法,相当于数组的compactMap,可以过滤nil,类型转换
//通过compactMapValues 将值转换成integer类型,并且将DNF过滤掉
let finishers1 = times.compactMapValues { Int($0) }
//也可以这样写
let finishers2 = times.compactMapValues(Int.init)
// 过滤nil
let people = [
"Paul": 38,
"Sophie": 8,
"Charlotte": 5,
"William": nil
]
let knownAges = people.compactMapValues { $0 }
// Al
let scores = [100,80,85]
let passCount = scores.count { $0 >= 85}
6 字符串由之前的 String(stringInterpolationSegment: language)变成 DefaultStringInterpolation(
literalCapacity: 7,
interpolationCount: 1)
7 swift5 标准库里面增加了Result枚举
// 1
enum ConnectionError: Error {
case noNetwork, noDatabase
}
// 2
let networkSuccess = Result<String, ConnectionError>.success("Network connected!")
let databaseSuccess = Result<String, ConnectionError>.success("Database connected!")
let networkFailure = Result<String, ConnectionError>.failure(.noNetwork)
let databaseFailure = Result<String, ConnectionError>.failure(.noDatabase)
let sameSuccess = networkSuccess == databaseSuccess
let sameFailure = networkFailure == databaseFailure
let success: Set = [networkSuccess, databaseSuccess]
let failure: Set = [networkFailure, databaseFailure]
let successDictionary = [
networkSuccess: try! networkSuccess.get(),
databaseSuccess: try! databaseSuccess.get()
]
let failureDictionary = [
networkFailure: ConnectionError.noNetwork,
databaseFailure: ConnectionError.noDatabase
]
8 增加了Python或Ruby等脚本语言交互的动态可调用类型
@dynamicCallable
class DynamicFeatures {
// 2
func dynamicallyCall(withArguments params: [Int]) -> Int? {
guard !params.isEmpty else {
return nil
}
return params.reduce(0, +)
}
func dynamicallyCall(withKeywordArguments params: KeyValuePairs<String, Int>) -> Int? {
guard !params.isEmpty else {
return nil
}
return params.reduce(0) { $1.key.isEmpty ? $0 : $0 + $1.value }
}
}
// 3
let features = DynamicFeatures()
features() // nil
features(3, 4, 5) // 12
features(first: 3, 4, second: 5) // 8
10 swift为package增加了一些新特性,可以在Package.swift中定义部署目标平台的最低版本
let package = Package(name: “Package”, platforms: [
.macOS(.v10_14),
.iOS(.v12),
.tvOS(.v12),
.watchOS(.v5)
])
11 Swift增加了对Codable的范围支持
let temperature = 0...10
let encoder = JSONEncoder()
let data = try! encoder.encode(temperature)
let decoder = JSONDecoder()
let temperatureRange = try! decoder.decode(ClosedRange<Int>.self, from: data)
12 移除Collection的定制点
extension Array {
var first: Element? {
return !isEmpty ? self[count - 1] : nil
}
var last: Element? {
return !isEmpty ? self[0] : nil
}
}
let names = ["Cosmin", "Oana", "Sclip", "Nori"]
names.first // "Nori"
names.last // "Cosmin"
swift中可以直接通过first和last来访问值
13 swift4.2使用self来访问
class Tutorial {
let title: String
let author: String
init(title: String, author: String) {
self.title = title
self.author = author
}
}
var tutorial = Tutorial(title: "What's New in Swift 5.0?", author: "Cosmin Pupaza")
tutorial.self = Tutorial(title: "What's New in Swift 5?", author: "Cosmin Pupăză")
swift5.0可以使用keyPath来访问
tutorial[keyPath: \.self] = Tutorial(
title: "What's New in Swift 5?",
author: "Cosmin Pupăză")
14 字面量的强制通过
let value = UInt64(0xFFFF_FFFF_FFFF_FFFF)
15 swift在条件检查时增加了 <使条件描述更清晰
#if swift(<5)
evenNumber = favoriteNumber % 2 == 0
#else
evenNumber = favoriteNumber.isMultiple(of: 2)
#endif
16 对于4.2种的枚举使用可变参数
enum BlogPost {
case tutorial(_: String...)
case article(_: String...)
}
swift取而代之的使用数组
enum BlogPost {
case tutorial([String])
case article([String])
}
17 swift 4.3的字面的偏移
let swiftVersion = "Swift 4.2"
let offset = swiftVersion.endIndex.encodedOffset
swift5.0中字面量的偏移
let swiftVersion = "Swift 5"
let offset = swiftVersion.endIndex.utf16Offset(in: swiftVersion)
18
SIMD 向量
Swift 5 将处理器的 SIMD 类型操作添加到标准库中,为 SIMD 向量和矩阵提供底层支持。 该特性也简化了<simd/simd.h>
中的 Objective-C、C 和 C++实现。