常量和变量
- 常量:
- 使用let关键词来声明一个常量
- 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的
- 编程时使用常量能够让代码看起来更加安全和简洁!
- let name = “siri” // 一个人的名字一般是不变的,声明为一个常量
- 变量:
- var关键词声明一个变量
- 变量的值可以根据需要不断修改
- var age = 10 // 一个人的年龄是变化的 ,声明为一个变量
age = 20
- var age = 10 // 一个人的年龄是变化的 ,声明为一个变量
- 可以在一行中声明多个变量或常量
- var x = 10.0, y = 44.0, z = 0.0
- 类型注解:
- 声明时注明该变量或常量的类型。 实际编程中很少需要使用类型注解,定义常量或者变量的时候Swift已经根据初始化的值确定了类型信息。Swift几乎都可以隐式的确定变量或常量的类型。如果初始化值没有被给出,更好的办法是指定变量的类型而不是让Swift隐式推导类型。
- var name :String // 类型注解为字符串 String
注意一:如果一个值在之后的代码中不会再变化,应该用let关键词将它声明为常量。变量只用来存储会更改的值。
变量和常量命名
- 基本上你可以用任何你喜欢的字符作为常量和变量名
- let 姓名 = "小飞"
let 电话 = "123456666"
let 😊 = "帅哥一枚"
print("\(姓名 + 电话 + 😊)")
- let 姓名 = "小飞"
小飞123456666帅哥一枚
- 常量和变量命名的注意点
- 1、不能包含数学符号(比如+、-、*、\)
2、不能包含箭头
3、不能包含非法无效的Unicode字符
4、不能是关键字
5、不能以数字开头
6、不能是单独一个下划线 _
- 1、不能包含数学符号(比如+、-、*、\)
整型
- 有符号(signed):正、负、零
- 8位、16位、32位、64位跟C语言中的相同。
- Int:和平台相关,默认相当于OC中的NSInteger
- 无符号(unsigned): 正、零
- 8位、16位、32位、64位跟C语言中的相同。
- UInt:和平台相关,默认相当于OC中的NSUInteger
- 表示形式:
- 1、十进制数:没有前缀
let a1 = 10
2、二进制数:以0b为前缀
let a2 = 0b1010 //10
3、八进制数:以0o为前缀
let a3 = 0o12 //10
4、十六进制:以0x为前缀
let a4 = 0xA //10
- 1、十进制数:没有前缀
- 整数边界:通过min和max属性来获取某个类型的最小值和最大值
- let minValue = UInt8.min // 0
let maxValue = UInt8.max // 255
- let minValue = UInt8.min // 0
浮点型
- 如果没有明确说明类型,浮点数默认就是Double类型
- Double:至少15位小数
- Float:至少6位小数
- let ffff: Float = 3.14
let dddd = 1.23 //没有指定 默认Double
let number0 = Double(ffff) + dddd//如果不转为Double会报错,Swift是类型安全语言,但是下面的写法是正确的
let number1 = 3.14 + 1.23 // 因为这样写运算是先相加再赋值
- let ffff: Float = 3.14
- 整数和浮点数转换
- 必须显示声明
- let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
- let three = 3
- 必须显示声明
注意:数值类型常量/变量的类型转换规则和数字类型常值的转换规则不同。常值3可以直接与常值0.14159相加,因为常值没有一个明确的类型。他们的类型是被编译器推导出来的。
数字格式
- 可以增加额外的零0
- let money = 00111 //111
let money2 = 00111.000 //111.0
- let money = 00111 //111
- 可以增加额外的下划线 _,以增强可读性
- let oneMillion1 = 1_000_000
let oneMillion2 = 100_000.000_001
- let oneMillion1 = 1_000_000
- 注:增加了额外的0和下划线并不会影响原来的数值大小
类型别名
- 类型别名:为现有类型定义的可替代名称。 使用 关键字 typealias。并且原类型能用在什么地方,别名就能用在什么地方
- typealias MyInt = Int
- 使用:
- 声明变量\常量
- let num: MyInt = 20
- 获得类型的最值
- let minValue = MyInt.min
- 类型转换
- let num = MyInt(3.14) //3
- 声明变量\常量
布尔类型
- Swift中的布尔类型使用Bool定义,也被称为Logical(逻辑)类型,可选值是true和false,跟OC有所不同
- let isOpen = true
let isIn = false
- let isOpen = true
- 跟Int 和 Double 类型一样,定义布尔类型的时候不需要显式的给出数据类型,只需要直接赋值true或false即可
- Swift的类型安全策略会防止其他非布尔类型转换为布尔类型使用
- let i = 1
if i {
// error: type 'Int' does not conform to protocol 'BooleanType'
}
- let i = 1
元组类型
- 元祖类型是一种数据结构,类似于数组或者字典,可以用于定义一组数据
- 元组类型可以将一些不同的数据类型组装成一个元素,这些数据类型可以是任意类型,并且不需要是同样的类型。
- 元祖的定义:写法一
- let http404Error = (404, "Not Found”) // 这个元祖可以描述为类型(Int,String)的元祖
- 元祖的定义:写法二(直接指定每个元素的名称,然后直接使用元组名.元素名访问)
- let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
print("The status message is \(http200Status.description)")
- let http200Status = (statusCode: 200, description: "OK")
- 元祖的定义:写法三
- let (errorCode, errorIno) = (404, "Not Found")
print(errorCode)
print(errorIno)
- let (errorCode, errorIno) = (404, "Not Found")
- 元祖的访问
- let http404Error = (404, "Not Found")
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")
- let http404Error = (404, "Not Found")
The status code is 404
The status message is Not Found
- 如果仅需要元组中的个别值,可以使用(_)来忽略不需要的值
- let (statusCode1, _) = http404Error
- 也可以使用元素序号来选择元组中的值,注意序号是从0开始的
- print("The status code is \(http404Error.0)")
The status code is 404
可选类型
- 在一个值可能不存在的时候,可以使用可选类型。这种类型的定义是:要么存在这个值并且等于X,要么这个值不存在。
- 在OC中有一种相似的类型—-nil,但仅对对象有用,其他情况返回一个特殊值(比如NSNotFound)来表明这个值不存在。
- Swift中nil也是一个特殊的类型,但是因为和真实的类型不匹配不能赋值
- 可选类型的写法:由于可选类型都会要改变的,所以定义用 var
- 写法一:
- var mySrr1 : Optional<String> = nil
- 写法二:
- var myStr2 : String? = nil
- 写法一:
- 可选类型赋值
- var myName : Optional<String>
myName = "Siri"
//错误写法 myName 是可选类型,不能直接和字符串拼接
let info = "my name is " + myName // 会有下面的错误提示
- var myName : Optional<String>

- 可选类型赋值:可选类型+!,强制解包
- let info = "my name is " + myName!
- 注意:如果可选类型为nil 强制解包 会拨错
- var herName : String?
herName = "Siri"
print(herName) // 可选类型,打印会带Optional
print(herName!)
herName = nil
print(herName!) // 报错
- var herName : String?
Optional("Siri”)
Siri
fatal error: unexpectedly found nil while unwrapping an Optional value
// 正确写法
ifherName != nil {
print(herName!)
}
// 简单写法:为了让在if语句中可以方便使用string
ifvar str = herName {
print(str)
}
选择绑定
- 选择绑定帮助确定一个可选值是不是包含了一个值,如果包含,把该值转化成一个临时常量或者变量。选择绑定可以用在if或while语句中,用来在可选类型外部检查是否有值并提取可能的值
- 常量和变量都可以用来做可选绑定。如果你想要在if第一个分支修改personAge的值,用var 修饰personAge
- class Person {
var name = "Siri"
var age : Int?
}
var person = Person()
if let personAge = person.age { // 必须是可选值
print("有值")
} else {
print("没值")
}
没值
- class Person {
nil
- Swift中,nil不是指针而是一个特定类型的空值。任何类型的可选变量都可以被设为nil,不光是指针。
隐式解包可选类型
- 直接在类型后面加! 来指定
- 隐式解包的可选类型主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况。这主要用在类的初始化过程中
- 隐式解包的可选类型本质是可选类型,但是可以被当成一般类型来使用,不需要每次验证值是否存在
- let possibleString: String? = "An optional string."
print(possibleString!)
let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString)
- let possibleString: String? = "An optional string."
- 注意:如果一个隐式解包的可选类型不包含一个实际值,那么对它的访问会抛出一个运行时错误。在变量/常量名后面加!的情况也是一样的。
- 你可以把解包可选类型当成正常的可选类型来探测是否有值。
- if (assumedString != nil) {
print(assumedString)
}
- if (assumedString != nil) {
- 或者通过类型绑定检查
- if let definiteString = assumedString {
print(definiteString)
}
- if let definiteString = assumedString {
注意:如果一个可选类型存在没有值的可能的话,不应该使用解包可选类型。这种情况下,一定要使用正常的可选类型。
断言
- 可选类型:让编程人员可以在运行期检测一个值是否存在,然后使用代码来处理不存在的情况
- 断言:如果一个值 不存在或者值不满足条件会直接影响代码的执行,使用断言结束程序的执行从而提供调试的依据。
- 使用全局函数assert来使用断言调试,assert函数接受一个布尔表达式和一个断言失败时显示的消息
- let age = 19
assert(age >= 18, "未成年”) //如果条件为 false 程序崩溃,错误日志:未成年。错误日志也可以省略
- let age = 19

- 断言使用时机:
- 传递一个整数类型下标的时候,比如作为数组的Index,这个值可能太小或者太大,从而造成数组越界;
- 传递给函数的参数,但是一个无效的参数将不能在该函数中执行
- 一个可选类型现在是nil,但是在接下来的代码中,需要是非nil的值才能够继续运行。