Swift 4.0有哪些新功能
在本教程中,你将了解Swift 4中发布了哪些变化。每一次,苹果都会发布重大版本,对API进行大量的改进和补充。
Swift 4.0引入的新功能包括改进的键值编码、编码和解码的键值路径,多行字符串字面,字符串是集合,改进的字典功能,单边范围,以及许多其他代码增强。
编码和解码
在Swift 4.0中,苹果公司引入了Codable协议,以使编码和解码对开发者来说更容易。你可以使用这个协议在你的代码中实现序列化和反序列化。你可以对你的自定义数据类型进行编码和解码,而不用写很多代码。
你可以使用编码在属性中存储值,并可以从自定义数据类型中生成自定义JSON。Swift会自动对你的数据类型内的所有属性进行编码–你不需要做任何事情。
多行字符串字元
在Swift 4.0之前,你可以在字符串中使用/n来添加新的换行符,只要你想。很明显,在字符串中使用/n在代码中看起来并不合适。
在Swift 4.0中,苹果用一种简化的多行字符串字面语法解决了在字符串中添加新行和使用双引号的问题。它允许你自由添加换行符,并使用三个双引号和回车键。此后开始用任何变量、换行符和双引号编写字符串,只要你想。
示例
let professional = "🧑💻"
let introduction = """Swift language is most popular among iOS developer \(professional).
Further....
Swift is a fantastic way to write software, whether it’s for phones, desktops, servers, or anything else that runs code.
It’s a safe, fast, and interactive programming language.
"""
print(introduction)
输出
Swift language is most popular among iOS developer 🧑💻.
进一步….
Swift是编写软件的绝佳方式,无论是手机、台式机、服务器,还是其他任何运行代码的东西。
它是一种安全、快速和互动的编程语言。
改进的键值编码
Objective-C的一个关键特征是它能够抓取根对象的名称,并动态地钻取任何属性名称,而不是用简单的字符串字面指定对象键。这些引用,即关键路径,在编译时强制检查一个类型是否包含所需的关键,从而消除了一个常见的运行时错误类型。
词典的增强
Swift 4为Dictionary和Set增加了新的强大功能。由于增加了一些实用的方法,它们使用起来更顺手了。
Swift 4在字典上有一个mapValues方法,可以转换所有的值,并使用原来的键把它们放回字典里。
现在可以访问字典,并在使用下标语法时提供一个默认值,以避免后来解开一个可选项。
最后,Dictionary 的一个新成员是一个分组初始化器。这允许你通过将现有集合的序列按你设定的任何标准分组来创建一个新的字典。
增强型弦乐
在Swift 4中,对字符串进行了许多改进,并为字符串类型增加了新的功能。让我们来看看其中的一些。
弦子再次成为收藏品
字符串再次成为像Swift 2.0之前那样的集合。这一变化消除了对字符串的字符数组的需求。现在你可以直接在一个字符串对象上迭代
示例
这里我们将展示如何在Swift 4.0中迭代一个字符串的字符。
let stringValue = "Swift"
for char in stringValue {
print(char)
}
输出
S
w
i
f
t
在Swift 4之前,你使用String的字符数组。但现在你可以像其他集合(如数组)一样直接迭代字符串。
字符串协议
这个协议的所有功能都是以字符串的形式实现的。在Swift 4中,苹果增加了一个新的类型,叫做Substring,用来表示String的一个子序列。字符串和子串都符合StringProtocol,其行为方式几乎相同。
示例
let sentence = "Swift language is great"
// How to make a subsequence?
let endIndex = sentence.index(sentence.startIndex, offsetBy: 4)
let languageName = sentence[sentence.startIndex...endIndex]
// print the substring and check the type of that string
print("Language name is: \(languageName) and it is type of: \(type(of: languageName))")
输出
Language name is: Swift and it is type of: Substring
适应Unicode 9
在Swift 4之后,字符串能够正确解释Unicode字符。
示例
print("👩💻".count) // Now: 1, Before: 2
print("👍🏽".count) // Now: 1, Before: 2
print("👨❤️💋👨".count) // Now: 1, Before: 4
输出
2
1
4
单侧范围
Swift采用了Python的单边范围,在这个范围内,缺边会被自动视为序列的开始或结束。我们不需要担心潜在的断裂,因为它与现有的代码无关。
Swift 4增加了使用单边范围推断开始和结束指数的能力。
示例
let planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
let firstPart = planets[..<4] // Before: planets[planets.startIndex..<4]
let secondPart = planets[4...] // Before: planets[4..<planets.endIndex]
print("First part: \(firstPart)")
print("Second part: \(secondPart)")
输出
First part: ["Mercury", "Venus", "Earth", "Mars"]
Second part: ["Jupiter", "Saturn", "Uranus", "Neptune"]
Swift软件包管理器中的更新
- Swift软件包管理器已经发生了许多变化。有如。
-
基于分支或提交哈希值寻找依赖关系
-
提供每个目标的源文件的位置
-
可接受软件包的版本控制
-
定义用于编译的Swift版本
通用下标
下标是使数据类型以直观的方式被访问的一个非常有价值的部分。为了提高它们的实用性,子标现在可以像下面这样通用。
示例
struct GenericDictionary<Key: Hashable, Value> {
private var data: [Key: Value]
init(data: [Key: Value]) {
self.data = data
}
subscript<T>(key: Key) -> T? {
return data[key] as? T
}
}
// creating a dictionary of type: [String: Any]
var earthData = GenericDictionary(data: ["name": "Pathik Patel", "score": 80])
// name will automaitcally infers return type without "as? String"
let name: String? = earthData["name"]
print("Name is: \(name ?? "") and type: \(type(of: name))")
// score will automatically infers return type without "as? Int"
let score: Int? = earthData["score"]
print("Score is: \(score ?? 0) and type: \(type(of: score))")
输出
Name is: Pathik Patel and type: Optional<String>
Score is: 80 and type: Optional<Int>
结论
这些年来,Swift语言确实在不断成长和成熟。Swift 4的这些变化让我们对Swift语言有了稳定的掌握。起初,由于发生了重大变化,处理Swift代码库很困难,但现在它更稳定了。
尽量使用代码中的大部分功能,在应用程序中编写优化代码。