Swift其实也有main函数,只不过编译器帮我们写了
一、数据类型
Int:整型值
Double:浮点型
Float:浮点型
Bool:布尔型
String:字符串
Array:数组
Set:集合
Dictionary:字典
Tuple:元组(高阶数据类型,作用:可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值)
Optional:可选类型(用于处理值缺失的情况。可选表示 “那儿有一个值,并且它等于 x ” 或者 “那儿没有值” 。可选有点像在 Objective-C 中使用 nil ,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的 nil 指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。)
二、常量和变量、类型注解、命名、输出、注释、分号、数值型字面量、数值型类型转换、类型别名
1.常量和变量:常量和变量必须在使用前声明
a.常量:
用let声明,一般用来声明不需要改变的值,常量的值一旦设定就不能改变,只能赋值1次,但是它的值不要求开始时就赋值但是要声明类型,不要求编译时就确定值,但是使用前赋值
let a: Int
let a = 10
let a = 10, b = 11, c = 12
b.变量:
用var声明,一般用来声明需要改变的值哦,变量的值可以随意改变
var a = 20
var a = 20, b = 21, c = 22
2.类型注解(就是说该常量或者变量是什么类型的)
如果你在声明常量或者变量的时候赋了一个初始值,Swift 可以推断出这个常量或者变量的类型,依据类型安全和类型推断。直接赋值是通过初始值推断的,而标明类型则是通过类型注解指定的。
var text: String // 声明一个类型为String,名字为text的变量
text = "Hello"
var red, green, blue: Double // 一行中可以定义多个同样类型的变量,用逗号分割,并在最后一个变量名之后添加类型注解
3.常量和变量的命名
a.常量和变量名可以包含任何字符,包括 Unicode 字符,不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
b.不能将常量与变量进行互转,不能使用相同的名字再次进行声明
c.如果你需要使用与 Swift 保留关键字相同的名称作为常量或者变量名,你可以使用反引号(`)将关键字包围的方式将其作为名字使用。无论如何,你应当避免使用关键字作为常量或变量名,除非你别无选择。
let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
4.输出常量和变量
你可以用 print(_:separator:terminator:) 函数来输出当前常量或变量的值。(separator:分隔符,terminator:终止符)
print("你好")
print("你好 \(a)")
5.注释
a.单行注释://
b.多行注释:/**/(swift中可以多行注释嵌套多行注释)
6.分号
与其他大部分编程语言不同,Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:
let cat = "🐱"; print(cat)
7.数值型字面量
整数字面量可以被写作:(下面的所有整数字面量的十进制值都是 17:)
一个十进制数,没有前缀 let decimalInteger = 17
一个二进制数,前缀是 0b let binaryInteger = 0b10001 // 二进制的17
一个八进制数,前缀是 0o let octalInteger = 0o21 // 八进制的17
一个十六进制数,前缀是 0x let hexadecimalInteger = 0x11 // 十六进制的17
8.数值型类型转换
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
let integerPi = Int(pi)
9.类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用 typealias 关键字来定义类型别名。
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min // 值为0
三、整数、浮点数、布尔值、元组(tuples)、可选类型
1.整数
a.整数有正、负、零(有符号和无符号的区别就是 "+" "-")
b.Swift 提供了8、16、32和64位的有符号和无符号整数类型(8位无符号整数类型是UInt8,32位有符号整数类型是Int32)
c.获取不同整数类型的min和max
let minValue = UInt8.min // minValue 为 0,是 UInt8 类型
let maxValue = UInt8.max // maxValue 为 255,是 UInt8 类型
d.特殊整数类型Int:一般来说,你不需要专门指定整数的长度。Swift 提供了一个特殊的整数类型 Int,长度与当前平台的原生字长相同,在32位平台上,Int 和 Int32 长度相同,在64位平台上,Int 和 Int64 长度相同,一般来说使用 Int 就够了,除非你需要特定长度的整数
e.特殊无符号类型UInt:长度与当前平台的原生字长相同,在32位平台上,UInt 和 UInt32 长度相同,在64位平台上,UInt 和 UInt64 长度相同,尽量不要使用 UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。
2.浮点数
a.Double:表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。至少有15位数字。
b.Float:表示32位浮点数。精度要求不高的话可以使用此类型。只有6位数字
c.在两种类型都匹配的情况下,将优先选择 Double。
3.布尔值
Bool:trun或者false
let a = true
let b = false
if a {
print("是真的")
} else {
print("是假的")
}
4.元组(tuples)
a.元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。例如(404, "Not Found") 是一个描述 HTTP 状态码(HTTP status code)的元组。
b.元组也可以进行内容分解,分解成单独的常量和变量
c.如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记
d.你还可以通过下标来访问元组中的单个元素,下标从零开始
e.可以在定义元组的时候给单个元素命名,给元组中的元素命名后,你可以通过名字来获取这些元素的值。
f.作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个 (Int, String) 元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。
g.当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构比较复杂,不要使用元组,用类或结构体去建模。
let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found"),是个元组。
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
print("The status code is \(http404Error.0)")
print("The status message is \(http404Error.1)")
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
print("The status message is \(http200Status.description)")
5.可选类型
a.使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示两种可能:无值 或者有值, 你可以解析可选类型访问其是否有值。类似OC一个方法返回对象或者返回nil。
b.Swift 的 Int 类型有一种构造器,作用是将一个 String 值转换成一个 Int 值。然而,并不是所有的字符串都可以转换成一个整数。字符串 "123" 可以被转换成数字 123 ,但是字符串 "hello, world" 不行。因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个 Int。一个可选的 Int 被写作 Int? 而不是 Int。问号暗示包含的值是可选类型,也就是说可能包含 Int 值也可能不包含值。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都没有。
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
c.可以给可选变量赋值为 nil 来表示它没有值,nil 不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil。Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。
var serverResponseCode: Int? = 404 // serverResponseCode 包含一个可选的 Int 值 404
serverResponseCode = nil // serverResponseCode 现在不包含值
var surveryAnswer: String? // 该变量自动被置为nil
d.可以使用 if 语句和 nil 比较来判断一个可选值是否包含值。你可以使用“相等”(==)或“不等”(!=)来执行比较。如果可选类型有值,它将不等于 nil
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
e.当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping),使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 ! 来强制解析值之前,一定要确定可选包含一个非 nil 的值。
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
f.可选绑定:使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。i
if let constantName = someOptional {
statements
}
if let actualNumber = Int(possibleNumber) { // 它已经被可选类型 包含的 值初始化过,所以不需要再使用 ! 后缀来获取它的值。
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
g.可以包含多个可选绑定或多个布尔条件在一个 if 语句中,只要使用逗号分开就行。只要有任意一个可选绑定的值为 nil,或者任意一个布尔条件为 false,则整个 if 条件判断为 false。
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 { // 输出“4 < 42 < 100”
print("\(firstNumber) < \(secondNumber) < 100")
}
h.在 if 条件语句中使用常量和变量来创建一个可选绑定,仅在 if 语句的句中(body)中才能获取到值。相反,在 guard 语句中使用常量和变量来创建一个可选绑定,仅在 guard 语句外且在语句后才能获取到值
i.可选类型暗示了常量或者变量可以“没有值”。可选可以通过 if 语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面例子来区分可选类型String和隐式可选类型String,以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
j.可以把隐式解析可选类型当做普通可选类型来判断它是否包含值,可以在可选绑定中使用隐式解析可选类型来检查并解析它的值
if assumedString != nil {
print(assumedString!)
}
if let definiteString = assumedString {
print(definiteString)
}
k.如果一个变量之后可能变成 nil 的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是 nil 的话,请使用普通可选类型。
6.错误处理
a.一个函数可以通过在声明中添加 throws 关键词来抛出错误消息。当你的函数能抛出错误消息时,你应该在表达式中前置 try 关键词。
func canThrowAnError () {
// 这个函数有可能抛出错误
}
do {
try canThrowAnError()
// 无错误继续执行
} catch {
// 有错误消息抛出
}
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
7.断言和先决条件(待完善)
a.断言和先决条件是在运行时所做的检查,你可以用他们来检查在执行后续代码之前是否一个必要的条件已经被满足了。如果断言或者先决条件中的布尔条件评估的结果为 true(真),则代码像往常一样继续执行。如果布尔条件评估结果为 false(假),程序的当前状态是无效的,则代码执行结束,应用程序中止。
网友评论