编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/Deinitialization.html
在类实例被释放之前,会立即调用去初始化器。您使用deinit关键字编写去初始化器,类似于使用init关键字编写初始化器的方式。取消初始化器仅适用于类类型。
Deinitialization如何运作Swift 会在不再需要实例时自动处理这些实例,以释放资源。Swift通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述。通常,在实例被释放时,您不需要进行手动清理。但是,当您使用自己的资源时,您可能需要自己进行一些额外的清理。例如,如果您创建一个自定义类来打开文件并向其写入一些数据,您可能需要在类实例被释放之前关闭文件。
类定义每个类最多可以有一个去初始化器。取消初始化器不接受任何参数,并且没有括号:
deinit {
// perform the deinitialization
}
在实例处理分配发生之前,会自动调用去初始化器。您不得自己调用非初始化器。超类非初始化器由其子类继承,超类非初始化器在子 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID72
操作符是用来检查、更改或合并值的特殊符号或短语。例如,加法运算符(’ + ‘)将两个数字相加,如’ let i = 1 + 2 ‘,逻辑和运算符(’ && ‘)结合两个布尔值,如’ if enteredDoorCode && passsedretinascan ’。
Swift支持您可能已经从C等语言中知道的运算符,并改进了几种功能来消除常见的编码错误。赋值运算符(=)不返回值,以防止在等于运算符(==时被错误使用。算术运算符(+、-、*、/、%等)检测并禁止值溢出,以避免在处理大于或小于存储它们的类型允许值范围的数字时出现意外结果。您可以选择使用Swift的溢出运算符来评估溢出行为,如溢出运算符中所述。
Swift还提供了C中找不到的范围运算符,例如a..<b和a...b,作为表达一系列值的快捷方式。
本章介绍了Swift中的常见运算符。高级运算符涵盖了Swift的高级运算符 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
Swift 是 iOS、macOS、watchOS 和 Apple tvOS app 开发的新编程语言。尽管如此,从您在C和Objective-C开发的经验来看,Swift的许多部分都会很熟悉。
Swift提供了所有基本C和Objective-C类型的自己的版本,包括用于整数的Int、用于浮点值的Double和Float、用于布尔值的Bool和用于文本数据的String。Swift还提供了三种主要集合类型的强大版本,Array、Set和Dictionary,如集合类型中所述。
与C一样,Swift使用变量通过标识名称存储和引用值。Swift还广泛使用值无法更改的变量。这些被称为常数,比C中的常数强大得多。在整个 Swift 中,常量会使用,使代码在处理不需要更改的值时更加安全、更清晰。
除了熟悉的类型外,Swift还引入了Objective-C中没有的高级类型,例如元组。元组使您能够创建和传递值分组。您可以使用元组从函数中返回多个值作为单个复合值。
Sw ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/Properties.html
属性将值与特定类、结构或枚举相关联。存储属性将常量和变量值存储为实例的一部分,而计算属性计算(而不是存储)值。计算属性由类、结构和枚举提供。存储属性仅由类和结构提供。
存储和计算属性通常与特定类型的实例相关联。然而,属性也可以与类型本身相关联。这些属性被称为类型属性。
此外,您可以定义属性观察器来监控属性值的变化,您可以通过自定义操作来响应。属性观察者可以添加到您自己定义的存储属性中,也可以添加到子类从其超类继承的属性中。
您还可以使用属性包装器在多个属性的获取器和设置器中重用代码。
存储的属性在最简单的形式中,存储属性是作为特定类或结构实例的一部分存储的常量或变量。存储属性可以是变量存储属性(由var关键字引入)或常量存储属性(由let关键字引入)。
您可以为存储属性提供默认值,作为其定义的一部分,如默认属性值中所述。您还可以在初始化期间设置和修改存储属性的初始值。即使是常量存储属性也是如此,如初始化期间分配常量属性中所述。
以下示例定义了一个名为F ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
字符串是一系列角色,如"hello,world"或"albatross"Swift字符串由String类型表示。String的内容可以通过各种方式访问,包括作为Character值的集合。
Swift的String和Character类型提供了一种快速、符合Unicode的方式来处理代码中的文本。字符串创建和操作的语法轻巧且可读,字符串文字语法与C相似。字符串串联就像将两个字符串与+运算符组合在一起一样简单,字符串的可变性通过在常量或变量之间进行选择来管理,就像Swift中的任何其他值一样。您还可以使用字符串将常量、变量、文字和表达式插入较长的字符串中,该过程称为字符串插值。这样可以轻松创建用于显示、存储和打印的自定义字符串值。
尽管语法简单,但Swift的String类型是一个快速、现代的字符串实现。每个字符串都由独立于编码的Unicode字符组成,并支持在各种Unicode表示中访问这些字 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/NestedTypes.html
创建枚举通常是为了支持特定类或结构的功能。同样,可以方便地定义纯属实用程序类和结构,以便在更复杂类型的上下文中使用。为了做到这一点,Swift使您能够定义嵌套类型,从而在它们支持的类型的定义中嵌套支持枚举、类和结构。
要将类型嵌套在另一种类型中,请在它支持的类型的外部大括号中写入其定义。类型可以嵌套到所需的任意级别。
嵌套类型在行动下面的示例定义了一个名为BlackjackCard结构,该结构模拟了二十一点游戏中使用的扑克牌。BlackjackCard结构包含两种嵌套枚举类型,称为Suit和Rank。
在二十一点中,Ace卡的价值为1或11。此功能由一个名为Values结构表示,该结构嵌套在Rank枚举中:
struct BlackjackCard {
// nested Suit enumeration
enum Suit: Character {
case spades = “♠”, hearts & ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/Closures.html#ID102
嵌套是自包含的功能块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas。
闭包可以从定义常量和变量的上下文中捕获和存储对任何常量和变量的引用。这被称为关闭这些常量和变量。Swift为您处理捕获的所有内存管理。
注意
如果您不熟悉捕获的概念,请不要担心。下文在《捕捉价值观》中对此进行了详细解释。
函数中引入的全局和嵌套函数实际上是闭包的特殊情况。关闭采取三种形式之一:
全局函数是具有名称且不捕获任何值的闭包。
嵌套函数是具有名称的闭包,可以从其封闭函数中捕获值。
闭包表达式是用轻量级语法编写的未命名闭包,可以从其周围上下文中捕获值。
Swift的闭包表达式具有干净、清晰的风格,优化鼓励在常见场景中进行简短、无杂乱的语法。这些优化包括:
从上下文推断参数和返回值类型
来自单表达式闭包的隐式回报
速记参数名称
尾随闭包语法
嵌套表达式Nested Functions中引入的 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html
Swift内置支持以结构化方式编写异步和并行代码。异步代码可以暂停并稍后恢复,尽管一次只执行一个程序。在程序中暂停和恢复代码可以让它继续在更新用户界面等短期操作上取得进展,同时继续处理长期运行的操作,如通过网络获取数据或解析文件。并行代码意味着多个代码同时运行——例如,一台配备四核处理器的计算机可以同时运行四条代码,每个核心执行其中一项任务。使用并行和异步代码的程序一次执行多个操作;它暂停等待外部系统的操作,并使其更容易以内存安全的方式编写此代码。
并行或异步代码的额外调度灵活性也增加了复杂性。Swift允许您以允许一些编译时检查的方式表达您的意图——例如,您可以使用参与者安全地访问可变状态。然而,向缓慢或错误的代码添加并发并不能保证它会变得快速或正确。事实上,添加并发性甚至可能会使您的代码更难调试。然而,使用Swift对代码中需要并发的并发的语言级支持意味着Swift可以帮助您在编译时发现问题。
本章的其余部分使用并发一词来指代异步和并行代码的常见 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/Extensions.html
扩展为现有类、结构、枚举或协议类型添加了新功能。这包括扩展您无法访问原始源代码(称为追溯建模)的类型的能力。扩展类似于Objective-C中的类别。(与Objective-C类别不同,Swift扩展没有名称。)
Swift中的扩展可以:
添加计算实例属性和计算类型属性
定义实例方法和类型方法
提供新的初始化器
定义下标
定义和使用新的嵌套类型
使现有类型符合协议
在 Swift 中,您甚至可以扩展协议,以提供其要求的实现,或添加符合要求的类型可以利用的其他功能。有关更多详细信息,请参阅协议扩展。
注意
扩展可以为类型添加新功能,但它们不能覆盖现有功能。
扩展语法使用extension关键字声明扩展:
extension SomeType {
// new functionality to add to SomeType goes here
}
扩展可以扩展现有类型,使其采用一个或多个协议。要添加协议一致性,您编写协议名 ...
编程分享
未读翻译自:https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
Swift提供了各种控制流语句。这些包括while循环多次执行任务;if、guard和switch语句,以根据特定条件执行不同的代码分支;以及break和continue将执行流程转移到代码中的另一个点等语句。
Swift还提供了一个for-in循环,可以轻松地在数组、字典、范围、字符串和其他序列上迭代。
Swift的switch语句在许多类似C语言中比它的对应语句强大得多。案例可以匹配许多不同的模式,包括间隔匹配、元组和特定类型的转换。switch情况下的匹配值可以绑定到临时常量或变量,以便在案例正文中使用,复杂的匹配条件可以用每个案例的where子句表示。
For-In循环您可以使用for-in循环迭代序列,例如数组中的项、数字范围或字符串中的字符。
此示例使用for-in循环来迭代数组中的项目:
1let names = ["Anna", "Alex", "Brian", " ...