美文网首页
[译]基础知识

[译]基础知识

作者: 云淡风轻_ffb5 | 来源:发表于2018-08-29 00:06 被阅读0次

初次翻译,如有问题,欢迎大家一起讨论。欢迎转载,并指明出处,谢谢!

每章的内容通过【要点】勾出重点,等所有翻译工作完成,输出整体Swift知识框架

文档还是看原汁原味的英文文档,翻译内容权当参考!原文地址

要点


  1. 常量(let)和变量(var);
  2. 类型安全;
  3. 类型推断;
  4. Optional;
  5. 元组(tuple);

基础知识


尽管Swift作为一门新语言,用于开发iOS, macOS, watchOS, and tvOS应用,其很多特点还是和C以及Objective-C语言比较类似。

Swift为基本的C和Objective-C类型提供自己的版本,包括整型Int,浮点型DoubleFloat,布尔型Bool,字符串String。Swift还为三种主要集合类型提供了强大的支持:ArraySetDictionary,详见后续集合类型章节。

和C语言一样,Swift通过变量来存储数据,并通过一个可标识的变量名来指向这个数据。同时,Swift中广泛使用值不可变的变量,也就是我们常说的常量,Swift中常量的远比C语言中的常量强大。当你使用不可变值时,常量的使用让代码更清晰和安全。

除了这些常用的类型,Swift还支持一些Objective-C中没有的类型,例如元组(tuple)元组允许创建和传递一组数据,函数可以使用元组返回一个复合值,其中包含多个数据。

Swift也支持可选(optional)类型【译注:因为optional是Swift区别其他语言最大的一个特性,而“可选”的叫法可能会有所不妥,为了方便理解和记忆,本文及随后的文章都用optional,就像Int等基本类型一样】,该类型允许不包含值。optional表示要么有值,并且值等于X,要么没有值optional和Objective-C中的nil指针使用比较类似,但它可以用于任意类型,不仅仅是类optional不仅比Objective-C中的nil指针更安全和更具表现力,它同时也是Swift中大部分强大特性的核心。

Swift是类型安全的语言,意味着代码中使用的值的类型是明确的。如果代码中使用了String,类型安全将可以预防不小心传一个Int值给它。同样的,类型安全也将有效地预防意外的传一个optional String值给非optional String类型。类型安全使得我们在开发过程中,尽早的发现和修复错误。

常量和变量


常量和变量都有一个名字(例如:maximumNumberOfLoginAttempts 或者 welcomeMessage)和一个指定类型的值(例如:数字10或者字符串"Hello")。常量的值一旦被设置,将不可再改变,而变量的值则可被再次设置。

声明常量和变量

常量和变量必须在使用之前声明。我们通过关键字let声明常量,关键字var声明变量。下面这个例子,说明如何使用常量和变量来跟踪用户的尝试登录次数:

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

这段代码可以这么来解读:
“声明一个新的常量:maximumNumberOfLoginAttempts,给它赋值10。再声明一个新的变量:currentLoginAttempt,初始化其值为0。”

在这个例子中,允许的最大尝试次数被声明为一个常量,因为这个最大值将不会改变。而当前的尝试次数被声明为一个变量,因为这个值在每次尝试登录失败后,都会增加。

我们可以在同一行声明多个常量或者变量,相互之间用逗号分隔:

var x = 0.0, y = 0.0, z = 0.0

注意
如果一个存储值不会改变,请始终用let关键字将其声明为一个常量。变量仅用于存储需要改变的值。

类型注释

在声明常量或者变量时,可以提供类型注释,用以清楚的区分常量或者变量可以存储的值类型。类型注释的语法是:在常量名或者变量名的后面,用冒号(:)和空格分隔,写上具体的类型名字。

下面这个例子,声明了一个变量welcomeMessage,通过类型注释标明这个变量可以存储String值:

var welcomeMessage: String

声明中冒号的意思是:“...是一种...”,所以可以这么解读上面的代码:
“声明的变量welcomeMessage是一种String类型”。

“是一种String类型”说明可以存储任意String值,所以变量welcomeMessage可以正确的设置任意String值:

welcomeMessage = "Hello"

我们可以在同一行声明多个相关的变量,通过逗号分隔,把类型注释放到最后一个变量名后面:

var red, green, blue: Double

注意
实际开发过程中,其实比较少使用类型注释。如果在定义常量或者变量时,提供一个初始值,swift基本就能推断(infer)出它的具体类型,稍后类型安全和类型推断将会介绍。在上面的例子中,由于welcomeMessage没有初始化值,所以它的类型是由类型注释给出,而不是通过初始化值推断。

常量和变量命名

常量和变量的名字基本可以包含任意字符,包括Unicode字符:

let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"

常量和变量名字不能包含:空格、数学符号、箭头、专用(或无效)的Unicode编码、短横线-以及box-drawing characters(译注:这个不知如何翻译为好?欢迎讨论)。数字可以出现在除了开头的任意位置。

一旦声明了一个指定类型的常量或者变量,我们就不能(严格意义说是相同上下文)再声明一个同名的常量或者变量、或者修改它的存储类型。也不能将一个常量改为变量,或者变量改为常量。

注意
如果需要将常量或者变量的名字命名为Swift的保留关键字,请在名字前后加上重音符(`)。然而,除非在别无他法的情况下,尽量避免用关键字做名字。

我们可以改变变量的值为一个相同类型的其他值。例如,friendlyWelcome可以从"Hello!" 改为 "Bonjour!":

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome is now "Bonjour!"

和变量不同,常量的值一旦被设置,将不能再改变。尝试改变将会收到一个编译错误:

let languageName = "Swift"
languageName = "Swift++"
// This is a compile-time error: languageName cannot be changed.

打印常量和变量

我们可以用函数print(_:separator:terminator:)来打印常量或者变量:

print(friendlyWelcome)
// Prints "Bonjour!"

全局函数print(_:separator:terminator:)可以打印一个或者多个值到合适的输出上。例如在Xcode上,该函数将输出到Xcode的控制台(console)。参数separatorterminator都有初始值,所以调用函数时可以忽略它们。默认情况下,这个函数在结束时会添加一个换行。为了在结束时不添加换行,可以传一个空串给参数terminatorprint(someValue, terminator: "")。关于参数的默认值,参见后续的参数默认值介绍。

Swift用字符串插值( string interpolation)的方式,将常量名或者变量名作为占位符,插入到一个长字符串中,以此来提示Swift替换该常量或者变量的具体值。字符串插值的具体做法是:将名字包含在小括号中,并在左括号前面通过反斜线来转义它:

print("The current value of friendlyWelcome is \(friendlyWelcome)")
// Prints "The current value of friendlyWelcome is Bonjour!"

注意
字符串插值的所有使用方式,都将在后续字符串插值中介绍。

注释

注释是代码中非执行的文本,用作笔记或者提醒。Swift编译器会在编译代码时忽略掉注释。

Swift中的注释和C语言中的比较类似,单行注释是由两个正斜线表示(//):

// This is a comment.

多行注释是以一个正斜线和星号(/)开始,以一个星号和正斜线(/)结束:

/* This is also a comment
but is written over multiple lines. */

和C语言中多行注释不同的是,Swift中的多行注释可以嵌套。一个多行注释块中可以嵌套另一个多行注释块:

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */

嵌套的多行注释,可以快速轻松地注释掉大块代码,即使代码中已经包含了多行注释

分号

和其它语言不同的是,Swift不需要在每个语句后添加分号(;),尽管添加分号也不会有错。然而,如果想在同一行写多条语句,分号还是有用的:

let cat = "🐱"; print(cat)
// Prints "🐱"

整型

整型是没有小数部分的数字,例如42和-23。整型可以是有符号的(正数、0、负数),或者是无符号的(正数、0)。

Swift以8位、16位、32位、64位的方式,提供有符号和无符号的整型。这些整型的名字和C语言类似,例如UInt8表示8位的无符号整型,Int32表示32位的有符号整型。和Swift中其它类型一样,这些整型都有大写的名称。

整型范围

我们可以通过min或者max属性获取每个整型的最小值或者最大值:

let minValue = UInt8.min  // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max  // maxValue is equal to 255, and is of type UInt8

这些属性的值具有合适大小的数字类型,如上面例子中的UInt8,因此,它们可以和其它相同类型的值一起使用。

Int

多数情况下,我们不需要在代码中特意指出特定大小的整型。Swift提供了一个额外的整型,Int,它的大小与当前平台相关:

  • 32位平台上,Int的大小与Int32相同
  • 64位平台上,Int的大小与Int64相同

除非必须指明整型的大小,否则代码中尽量使用Int。这将有助于代码的一致性和互操作性(interoperability),即使在32位平台上,Int也能够满足足够大的整数范围(-2,147,483,648 - 2,147,483,647)。

UInt

Swift也提供了一个无符号整型,UInt,它的大小也和当前平台相关:

  • 32位平台上,UInt的大小与UInt32相同
  • 64位平台上,UInt的大小与UInt64相同

只有确定需要和当前平台大小相同的无符号整型时,才使用UInt,否则,即使存储非负的值,也应该首选Int。使用Int值有助于提高代码的互操作性,避免了不同数字类型之间的转换,也更容易匹配整型类型的推断,后续类型安全和类型推断将会介绍

浮点型数字

浮点型数字指含有小数部分的数字,如:3.14159、0.1、-273.15。

浮点型的取值范围比整型更宽,可以存储比Int更大或者更小的值,Swift提供了两种有符号浮点型:

  • Double代表64位浮点型数字
  • Float代表32位浮点型数字

Double最多可以表示15位十进制的小数精度,Float最多可以表示6位十进制的小数精度(eg:3.14159,0.141592)。代码中使用哪一种浮点型,取决于平台和数据取值范围。在两种类型都可以的情况下,首选Double

类型安全和类型推断

Swift是类型安全的语言,类型安全的语言鼓励在代码中清楚的写明数据类型,如果需要String类型,就不能错误的传Int型。

正是因为Swift是类型安全的,在编译过程中就会进行类型检查,并标出不匹配类型的错误,这样就能在开发过程中,及早发现和修复错误。

类型检查可以避免使用不同类型时出现错误,但这并不意味着每次声明常量或者变量时,必须指明类型。如果没有指明数据类型,Swift通过类型推断,推断出合适的数据类型。在编译器编译代码时,类型推断能够通过检查表达式中的数据,自动推断出某个表达式的类型。

有了类型推断,Swift比起C或者Objective-C少了很多类型声明,但常量和变量也是指定了类型的,只不过指定类型的大部分工作已经完成了。

类型推断在初始化常量或者变量时非常有用。通常在声明常量或者变量时,赋一个字面值(literal value)(或者字面)时发生。(字面值是指在源代码中,直接出现的文字值,例如下面例子中的42和3.14159)。

例如:在给一个新的常量赋字面值42时,Swift推断出这个常量是整型Int,因为它用来一个整型数字来初始化:

let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int

同样的,没有指定一个浮点字面值的类型,Swift推断出是要创建一个Double

let pi = 3.14159
// pi is inferred to be of type Double

Swift在推断浮点型数字时,总是选择Double,而不是Float

如果在表达式中,同时有整型和浮点型,根据上下文,Swift将会推断出表达式类型为Double

let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double

字面值3没有指定类型,输出类型推断为Double,是因为+表达式中出现了浮点型字面值。

未完待续……………………

相关文章

  • [译]基础知识

    初次翻译,如有问题,欢迎大家一起讨论。欢迎转载,并指明出处,谢谢! 每章的内容通过【要点】勾出重点,等所有翻译工作...

  • 《这样编码才规范:128个编码好习惯》目录

    这样编码才规范:128个编码好习惯[韩]朴晋锈 著 才璐 译 第1章基础知识概述1.1编码风格21.2编码风格...

  • 掌握提问

    本文译自GitHub Guide主要为了科普一些GitHub上的基础知识,为和我一样不知道如何上手,不懂概念的人提...

  • [译] ARMv8-A的基础知识

    在ARMv8-A中,程序会运行在四个异常级别中的一个。 在64位执行状态下,异常级别决定了执行权限级别,类似于AR...

  • 音频基础知识02

     音频基础知识 01  音频基础知识 02  音频基础知识 03  音频基础知识 04 人类收集声音的历史   为...

  • 2018-07-21

    分译法 分译法,又称为拆译法。从被分译的结构而言,分译大致可以分为单词的分译、短语的分译和从句的分译三种。 单词的...

  • PHP全栈学习笔记18

    php基础知识,JavaScript,jQuery,ajax基础知识 linux基础知识,mysql数据库的基础与...

  • PHP全栈学习笔记18

    php基础知识,JavaScript,jQuery,ajax基础知识 linux基础知识,mysql数据库的基础与...

  • C语言回顾

    基础知识 控制流 基础知识补充 其他主题

  • 翻译理论术语

    abusive translation滥译 adaptation归译 amplification增译 applie...

网友评论

      本文标题:[译]基础知识

      本文链接:https://www.haomeiwen.com/subject/tqpwiftx.html