美文网首页iOS 开发 Objective-C
Swift Language Guide5.2 第一篇:基础篇之

Swift Language Guide5.2 第一篇:基础篇之

作者: 望穿秋水小作坊 | 来源:发表于2020-03-11 17:37 被阅读0次

Comments 注释

在代码中使用注释来加入一段不执行的文本,作为你自己的一个笔记或者提醒。当 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. */

Semicolons 分号

和其他语言不同,Swift 不强制你再每一行代码后面加上 ; 分号,虽然喜欢的话可以加上。尽管如此,如果在一行里面有多句代码,那么分号作为分隔符是必须要加上的。

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

Integers 整型

整型是不带有小数部分的数字,比如 23-23。整型要么是带符号的(正,零,负)要么是不带符号的(正,零)。

Swift 提供 8 位,16 位,32 位和 64 位的带符号和不带符号的整型。这些整型遵守类似于 C 语言的命名约定,其实 8 位无符号整型是 UInt8,而 32 位有符号整型是 Int32,像 Swift 中所有的类型一样,这些整型的类型都有大写的名称。

Integer Bounds 整型的范围

可以通过访问每种整型的max``min属性来获取最大值和最小值。

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类型就行,除非你需要特别指定它的大小。这有助于保证代码的一致性和互通性。即使在 32 位的平台下,Int可以存储 -2,147,483,6482,147,483,647,这是一个足够大的整型范围。

UInt 无符号整型

Swift 也提供了大小和当前操作平台相关联的无符号整型 UInt:

  • 在 32 位的平台上,Int的大小是 UInt32.
  • 在 64 位的平台上, Int的大小是 UInt64.

NOTE
UInt 只能适用于非负数整型,在通常情况下我们选择使用 Int型会让代码有更好的容错率。

Floating-Point Numbers 浮点型

浮点型是带有小数部分的数字类型,比如 3.141590.1-273.15

浮点型能展现比整型更宽阔的范围,能储存比Int更大或者更小的数字。Swift 提供了两种带符号的浮点型:

  • Double 是 64 位浮点型
  • Float 是 32 位浮点型

NOTE
Double 的精度是 15 个十进制的数字,而 Float 的精度可以降低至 6 个十进制数字。要根据你的代码选择合适的浮点型。如果任何一种类型都适合的情况下,首选 Double.

Type Safety and type inference 类型安全和类型推断

Swift 是一个 type-safe 类型安全的语言。一个类型安全的语言鼓励你明确代码中所有类型的值。如果你的代码中需要一个String,那么你就不能给它传递Int

因为 Swift 是类型安全的语言,它会在编译的时候实行代码检查然后把错误的类型匹配标记出来。这可以使得你在软件开发中能尽早捕获和修复错误。

当你使用不同类型的值的时候,类型检查可以帮你避免这种错误。然而,这并不意味着你必须在声明一个变量或常量的时候给它指定类型。如果你不需要给它指定类型,Swift 会使用type inference类型推断出合适的类型。类型推断机制可以让编译器在编译你代码的时候,根据你的表达式检查你提供的值来推断出特定的类型。

因为有类型推断机制,Swift 比 C 语言和 Objective-C 需要更少的类型声明。常量和变量依然是明确的类型,当时大部分指定类型的工作都为你完成了。

类型推断机制在你用一个值去初始化常量或者变量的时候格外好用。通常在你声明常量或者变量的时候给他赋值就行了。

例如,你把 42赋值给一个新的常量而不说明它的类型,Swift 会推断你想要这个常量是 Int 类型的,因为你给它初始化的数值看起来一个 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.14159
// anotherPi is also inferred to be of type  Double

数字3没有明确指出类型,而浮点数作为加法的另一个参数,所以推断出 Double类型更为合适。

Numeric Type Conversion 数值类型转换

一般情况下使用 Int 类型来存储整型变量或者常量,即使你知道它不可能为负数。在日常情况下使用默认的整型类型意味着常量或变量有更好的互通性,可以和 类型推断出来的整型类型进行相互操作。

仅仅当前手头任务特别需要其他整型类型的时候才会使用其他类型,比如因为外部数据源有特别指定类型,或者为了性能,内存,或者其他必要的优化。在那些情况下使用特定的类型,可以帮忙不会一些意外的值溢出和隐式记录所使用数据的性质。

Integer Conversion 整型转换

每个数值类型能够存放数值访问是不同的。一个 Int8 的常量或变量能够存放 -128 到 127 的范围,然而一个 UInt 类型的常量或变量存放的是 0 到 255 的范围。当代码编译的时候如果一个数值常量或变量的值不在限定范围就会报错。

let cannotBeNegative: UInt8 = -1
// UInt8 cannot store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 cannot store a number larger than its maximum value.
// and so this will also report an error

因为每种数值类型的存储访问不同,所以你必须依据情况适当的加入类型转换。这种方式将避免你代码中的隐式转换错误和明确类型转换的意图。

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

因为现在加法两边的数值都是 UInt16,所以加法是被允许的,输出常量 twoThousandAndOne被推算出是 UInt16,因为是两个 UInt16的之和。

SomeType(ofInitialValue)调用 Swift 初始化并传递参数的默认方式。后台,通过初始化函数利用 UInt8的参数创建了一个 UInt16类型,这里你不能随意不传递任意类型。这将会在 Extensions 章节介绍。

Integer and Floating-Point Conversion 整型和浮点型的转换

浮点型和整型的转换必须是显式转换:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double

这里,Three用于创建一个新的Double 类型常量,所以加法两边的值类型相同。没有这个转换步骤,这个加法将会报错。

浮点型转整型也需要显式转换,一个整型可以通过Double或者Float类型来创建。

let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int

当整型初始化方法传入的是浮点型数据时,浮点数据会被才有去尾法。这就意味着 4.75变成4,而-3.9 变成 -3

NOTE
这种合并常量或变量的规则不同于字面量数值。字面量数值 3 是可以和 0.1315相加的,因为字面量数值并没有明确指出它的类型。他们的类型只有在编译器编译的时候才会被评估。

Type Aliases 类型别名

Type aliases 为现存的类别定义另一个名字。使用 typealias 关键字来定义类型别名。

当你想为一个现存的类型定义得更加贴合上下文,类型别名是非常有用的。比如使用外部来源的特点大小的数据时:

typealias AudioSample = UInt16

一旦你定义了类型别名,您可以在任何可能使用原始名称的地方使用别名:

var maxAmplitudeFound = AudioSample.min

在此,AudioSample 是一个为UInt16定义的别名。因为它是别名,所以调用AudioSample.min的方法实际上是调用 UInt16.min,所以这个提供的初始值是 0。

Booleans 布尔型

Swift 拥有基础的布尔型,叫做 Bool,布尔值是用在逻辑相关的,因为它的值只能是 true 或 false。Swift 提供两个布尔常量值 truefalse

let orangeAreOrange = true
let turnipsAreDelicious = false

orangeAreOrangeturnipsAreDelicious 从他们初始化使用的字面量来看被推断成 Bool类型。就像上面的 IntDouble一样,如果你在初始化的时候给他们赋值就不需要指定他们的类型了。类型推断让 Swift 的代码更加简洁和易阅读。

布尔值在条件判断语句中特别有用,比如if语句中:

if turnipsAreDelicious {
    print("Mmm, tasty turnips!")
} else {
    print("Eww, turnips are horrible.")
}
// Prints "Eww, turnips are horrible."

Swift 是类型安全的语言,所以不允许使用非布尔值来代替布尔值使用。比如下面的代码将会报错:

let i = 1
if i {
    // this example will not compile, and will report an error
}

然而,另一个例子就是合法的:

let i = 1
if i == 1 {
    // this example will compile successfully
}

i == 1的结果是布尔值的,所以第一个例子通过了类型检查。

和Swift 中其他类型安全的示例一样,这是为避免意外错误的,并确保代码的意图始终清晰。

相关文章

网友评论

    本文标题:Swift Language Guide5.2 第一篇:基础篇之

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