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 时,断言会被禁用。
网友评论