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

[译]基础知识

作者: 云淡风轻_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,是因为+表达式中出现了浮点型字面值。

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

    相关文章

      网友评论

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

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