OneDayOneSwift [1] - The Basics

Type basic

Swift provides its own versions of all fundamental C and Objective-C types,including In for integers,Double and Float for floating-point values,Bool for Boolean values,and String for textual data.Swift also provides powerful versions of the three primary collection types,Array,Set,and Dictionary.

Differents with others

  • tuples
  • Optionals (at the heart of many of Swift's most powerful features) are an example of the fact that Swift is a type safe language

常量和变量

命名可以是任意字符,包括Unicode。但不能包含数学箭头,保留(或者非法的)Unicode码位,连线和制表符,也不能以数字开头。 ps:如必须要使用与Swift保留关键字相同的名称,可以用反引号(`)将关键字包围使用。

String interpolation

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义。如:print("Hello \(name)")

Int

一般来说不需要专门指定整数的长度。Swift提供了特殊的整数类型 Int ,长度与当前平台的原生字长相同:32位平台上和Int32长度相同,64平台上和Int64长度相同。

浮点数

Double精确度很高,至少有15位数字,而Float只有6位数字

Type safe

Swift is a type safe language.A type safe language encourages you to be clear about the types of values your code can work with.If part of your code expect a String you can't pass it an Int by mistake. 由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。

Type inference

Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。

  • 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。
  • 数值型字面值(literal value)
  • 十进制,没有前缀
  • 二进制,前缀是0b
  • 八进制,前缀是0o
  • 十六进制,前缀是0x
  • 浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是0x)。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。十进制浮点数也可以有一个可选的指数(exponent),通过大写或者小写的 e 来指定;十六进制浮点数必须有一个指数,通过大写或者小写的 p 来指定。eg.如果一个十进制数的指数为exp,那这个数相当于基数和10^exp的乘积:1.25e2 表示 1.25 × 10^2,等于 125.0。 1.25e-2 表示 1.25 × 10^-2,等于 0.0125。
  • 数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:let oneMillion = 1_000_000
  • 如果数字超出了常量或者变量可存储的范围,编译的时候会报错.如:let cannotBeNegative: UInt8 = -1// UInt8 类型不能存储负数,所以会报错
  • 结合数字类常量和变量不同于结合数字类字面量。字面量3可以直接和字面量0.14159相加,因为数字字面量本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。

元组(tuples)

let http404Error: (Int, String) = (404, "Not found")
let (statusCode, statusMessage) = http404Error
let (justTheStatusCode, _) = http404Error

let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
//输出 "The status code is 200"

ps: 元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。

Optionals

如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。你也可以包含多个可选绑定在if语句中,并使用where子句做布尔值判断。如下:

if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
    print("\(firstNumber) < \(secondNumber)")
}
// prints "4 < 42"

隐式解析可选类型(implicitly unwrapped optionals)

把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString  // 不需要感叹号

你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。
ps: 如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。

错误处理(error handling)

一个函数可以通过在声明中添加throws关键词来抛出错误消息。当你的函数能抛出错误消息时, 你应该在表达式中前置try关键词。

func makeASandwich() throws {
    // ...
}

do {
    try makeASandwich()
    eatASandwich()
} catch Error.OutOfCleanDishes {
    washDishes()
} catch Error.MissingIngredients(let ingredients) {
    buyGroceries(ingredients)
}

断言

可选类型可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况。然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能没办法继续执行。这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因。
断言会在运行时判断一个逻辑条件是否为true。从字面意思来说,断言“断言”一个条件是否为真。你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果条件判断为true,代码运行会继续进行;如果条件判断为false,代码执行结束,你的应用被终止。

let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0,所以断言会触发

ps: 当代码使用优化编译的时候,断言将会被禁用,例如在 Xcode 中,使用默认的 target Release 配置选项来 build 时,断言会被禁用。

你可能感兴趣的:(OneDayOneSwift [1] - The Basics)