常量和变量
1.使用let创建常量,使用var创建变量
import UIKit
//:常量,number的值不能改变
let number = 10
//:变量 number2的值可以改变
var number2 = 30
2.可以同时多声明多个变量或者常量,使用逗号隔开
let a = 1, b = 2, c = 3
var x = 1, y = 2, z = 3
3.type anotation类型注解
var message: String
当我们定义变量或者常量时,如果我们设置初始值,哪么编译器会根据初始值的类型,来设置变量或者常量的类型。如果没有设置初始值,哪么我们需要在变量或者常量后面,指明其类型。
4.swift标识符命名规则</br>
1.区分大小写;
2.不能与swift关键字冲突;
3.标识符由数字,字母和下划线组成;
4.标识符的首字母可以由下划线或者字母开始,但不能是数字;
note:swift中的字母是采用Unicode编码。Unicode叫做统一编码,它包含了亚洲的文字编码,如中文,日文,韩文等字符,甚至可以表示表情符号等。
如果一定要使用swift中的关键字,哪么需要使用重音符号(`)将其括起来。
let hello_xx_9898 = x
let _xxxdfdf_0 = 12
let 🐙🐙🐧🐔🐧🐥🦄🐛₮௹₢₧₯ = 90
var `class` = 100
5.变量与常量值打印
//直接在字符串中展示变量值 \(变量)
var numValue = 100.123456
print("the number value is \(numValue)")
//如果需要按特定的格式输出,哪么需要先按格式构造String对象,然后输出
let str = String(format: "the number is %.2f", numValue);
print(str)
</br>
注释
1.单行注释
//单行注释
print("hello world")
2.多行注释
/*
多行注释1
*/
print("hello world")
</br>
整数
1.swift提供了8,16,32和64位的有符号和无符号的整数类型
//无符号8位整型
var a: UInt8
//有符号8位整型
var b:Int8
//无符号16位整型
var c:UInt16
//有符号16位整型
var d:Int16
//无符号32位整型
var e:UInt32
//有符号32位整型
var f:Int32
//无符号64位整型
var g:UInt64
//有符号64位整型
var h:Int64
2.获取整型最大,最小值
//获取UInt8最小值
let minValue = UInt8.min
//获取UInt8最大值
let maxValue = UInt8.max
3.Int类型的大小取决与所在平台,我们推荐使用Int,这样可以提高代码的一致性和可复用性。
所在平台cpu是32位的,那么Int为Int32类型;
所在平台cpu是64位的,那么Int为Int64类型。
浮点数类型
1.Float表示32位浮点数类型
2.Double表示64位浮点数类型
let x:Double = 0.123456789012345678901234567890
let y:Float = 0.123456789012345678901234567890
数字类型转换
1.Int类型转换
let one: Int8 = 2
let two: Int16 = 20
let result = Int16(one) + two
2.整数和浮点数类型转换
let x = 3;
let y = 2.14;
let z = Double(x) + y
let z1 = x + Int(y)
3.浮点数与浮点数转换
let x: Float = 1.1
let y: Double = 2.2
let z = Double(x) + y
let z1 = x + Float(y)
note:数字类型的常量和变量不同于数字的字面量。字面量本身没有明确的类型。当编译器计算出值后,根据值推测类型。
let a = 3 + 2.13
类型别名
类型别名,就是将现有的类型定义另起一个名字。关键字:typealias
typealias CarNum = String
var carIdentifier: CarNum
carIdentifier = "苏A1234566"
你可以在任何使用原始名称的地方使用别名。
布尔值
布尔值指逻辑上的值,因为它们只能是真或者假。Swift有两个布尔常量,true和false
var isFlag = false
isFlag = true
元组
元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
1.我们可以将一个元组的内容分解成单独的常量和变量;
let http404Error = (404,"NOT FOUND!")
let (statusCode,statusMessage) = http404Error
print("http status code: \(statusCode) and message: \(statusMessage)")
2.如果我们只需要一部分元组值,分解的时候我们可以把要忽略的部分用下划线(_)标记;
let (_,message) = http404Error
print("the message is \(message)")
3.我们还可以通过下标来访问元组中的单个元素;
print("the one item value is \(http404Error.0)")
print("the two item value is \(http404Error.1)")
4.我们可以在定义元组的时候给单个元素命名,然后我们可以通过此命名来获取这些元素的值;
let http200Status = (statusCode:200,desc:"ok")
print("the one item is \(http200Status.statusCode)")
print("the two item is \(http200Status.desc)")
可选类型(optionals)
使用可选类型(optionals)来处理可能缺失的情况。
1.eg:
let str = "1234"
//intValue被推测为Int?
let intValue = Int(str)
因为并不是所有的字符串都可以转换成一个整数。所以Int的构造器可能会失败,所以它返回一个可选类型的Int?,而不是Int。问号?暗示了该类型的变量可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什么都没有)
2.我们可以给可选变量赋值为nil,来表示它什么值都没有。
note:nil只能用于可选的常量和变量
如果你声明一个可选常量或者变量,但没有赋值,系统会自动将其赋值为nil。
//定一个可选类型变量,但是没有赋值,哪么系统会自动赋值为nil
var value1: Int?
//nil只能赋值给可选类型变量或常量
value1 = nil
let value2: Int?
//nil只能赋值给可选类型变量或常量
value2 = nil
3.swift中的nil和OC中的nil并不一样。在OC中,nil是一个不指向任何对象的指针。在swift中不是指针,它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不单单是对象类型。
强制解析
当我们确定可选类型确实包涵值之后,你可以在可选的名字后面加一个感叹号!来获取值。这个感叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析。
let str = "1234"
//intValue被推测为Int?
let intValue = Int(str)
if intValue != nil{
print("the int value is \(intValue)")
print("the int valu eis \(intValue!)")
}
note:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。
可选绑定
1.可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。
let str = "1234"
//intValue被推测为Int?
var intValue = Int(str)
if let value = intValue {
print("int value is \(value)")
}else{
print("int value is nil")
}
2.我们可以包含多个可选绑定在if语句中,并可以使用where子句做布尔值判断。
let x = Int("1234")
let y = Int("4567")
if let xValue = x , yValue = y {
print("x value :\(xValue) and y value : \(yValue)")
}
if let xValue = x, yValue = y where y > x {
print("y > x")
}
隐式解析可选类型
有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的。这种类型的可选状态可以被定义为隐式解析可选类型。把用作可选类型后面的问号?改为感叹号! 来声明一个隐式解析可选类型。
let str1: String? = "hello world"
print("str value is \(str1!)")
let str2: String! = "hello world"
print("str value is \(str2)")
note:
1.如果我们在隐式解析可选类型没有值的时候进行取值,会造成运行时错误。如同我们在没有值的普通可选类型后面加一个感叹号!一样;
2.我们仍然可以把隐式解析可选类型当做普通可选类型来判断它是否含有值;
3.我们也可以在可选绑定中使用隐式解析可选类型来检查并解析它的值;
4.如果一个变量之后可能要变成nil的话,请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型。
错误处理
我们可以使用错误处理来应对程序执行中可能会遇到的错误。
//自定义错误类型
enum MyError : ErrorType {
case errorOne
case errorTwo
}
//抛出错误的方法
func hello() throws{
throw MyError.errorOne;
}
//方法调用与处理
do{
try hello()
}catch MyError.errorOne{
print("catch errorOne")
}catch MyError.errorTwo{
print("catch errorTwo")
}
断言
1.断言会在运行时判断一个逻辑条件是否为true。如果条件判断为true,代码运行会继续运行;如果条件判断为false,代码执行结束,程序被终止。
let x = 3
//不包含提示消息
assert(x > 0)
//包含提示消息
assert(x > 0, "x的值不能小于0哦")