/*:
Swift的基本类型:Int 整型;Double、Float 浮点型;Bool 布尔型;String 文本型。
Swift的集合类型:Array、Dictionary、Set
Swift的高阶类型:元组(Tuple),可以创建或传递一组数据,在作为函数返回值时,可以用一个元组返回多个值
Swift的可选类型:Optional类型,用于处理值缺失,表示哪儿有一个值为x,或者那儿没有值;类似于OC中的nil,但比其更加安全、强大,可以用在任何类型上,包括类
Swift是一门类型安全的语言,传入错误的类型(例如:需要String传入了Int、需要String传入了可选的String)会立刻报错提示
let用来声明常量,如果你处理的值不需要改变,使用常量会让代码更加安全
var用来声明变量,变量的值可以随意更改
Swift声明常量或变量时,不需要指定具体的类型,编译器或根据赋值情况自动推断,也可以在变量后声明类型,例如:
let age: Int = 17 //声明了一个Int型的常量age,并赋值为17,且age值不可更改
var name: String = "张三" //声明了一个String类型的变量,它的初始值是"张三",name可以在后面随意更改
语法规范:
在一行中声明多个常量或变量,用逗号隔开
可以不写分号,但如果在一行中写两条语句,需要用分号隔开
多行注释可以嵌套
变量常量的名称规范:不能用数字开头、不能使用数学符号、箭头、非法的Unicode字符、可以使用汉字、π、一些表情等
*/
//=================================c常量变量、多行字符串、取值范围、别名=================================
let age:Int = 17
let name:String = "张三"
print("定义属性打印的值为:\(age),\(name)")
//在一行中声明多个常量或变量,用逗号隔开
let x=0.0,y:String = "张三",z = 1
print(x,y,z)
//如果声明的是同样类型的常量或变量,用逗号隔开,最后一个变量后加上类型
var a,b,c:String
let nameAge = name + String(age)
print("类型的强制转换拼接:\(nameAge)")
let apples = 3
let oranges = 5
print("值转换为字符串:我有\(apples)个苹果,算上橘子一共有\(apples + oranges)个水果")
//对于多行的字符串使用三个双引号(“”)。删除每个引用行的开始处的缩进,只要它与结尾引号的匹配就行。例如:
let quotation = """
I said "I have \(apples) apples."
And then I said "I have \(apples + oranges) pieces of fruit."
"""
//可以用.min、.max查看一种类型的最小和最大取值范围
let minValue = Int.min
let maxValue = Int.max
//给类型定义别名
typealias myInt = Int
let myNum = myInt.max
//=================================元组=================================
//元组(tuples)把多个值组合成一个复合的值。元组内的值可以是任意类型,且不要求是相同类型
let http404Error = (404,"Not Found")//一个类型为(Int,String)的元组
let (stateCode,stateMsg) = http404Error
print("元组的完全分解:\(stateCode)---\(stateMsg)")
let (code,_) = http404Error//只获取想要的code,不想要的元组数据用_表示
print("元组的不完全分解:\(code)")
let errMsg = http404Error.1//可以通过元组的下标来获取该下标的值
print("通过下标获取元组中的值:\(errMsg)")
let http200State = (statusCode:200,description:"成功")//定义元组时可以给单个元素命名
print("通过元组中的元素名称获取值:\(http200State.statusCode)")
//=================================可选类型? 强制解析!隐式解析!=================================
let possibleNum = "hello"//123
let convertedNum = Int(possibleNum) //把一个字符串转换成Int,有可能会失败,失败后就是nil,此时convertedNum被推断为Int?类型,表示是可选类型
var serverResponseCode: Int? = 404 //可选类型,值为404
serverResponseCode = nil//赋值为nil,表示它没有值
//nil不能用于非可选的常量和变量;在Swift中nil不是一个指针,而是一个确定的值,用来表示值缺失
var sur: String? //如果在String后面加?下面赋值就会报错
sur = nil
var xxxx: Int?
if xxxx == nil {
print("如果xxxx不是可选类型,xxxx==nil的判断会报错")
}
var opValue: String?
//opValue = "小时"
if opValue != nil {//强制解析前需要判断是否为nil,否则会报错
print("强制解析一个可选值:\(opValue!)")
}
//隐式解析:已经肯定变量在生命周期中都不会为nil才可以使用隐式解析可选类型
//let optValue: String? = "第一次赋值"//如果能保证optValue一直会有值,可以把?换成!这样每次用的时候就不需要解析了
//let forValue: String = optValue!//需要加!来获取值
let optValue: String! = "我已经有值了"//一个可以自动解析的可选类型,在声明的时候就把!放在类型的结尾,然后就可以直接取值了
let forValue: String = optValue//不用加!直接取值,因为在定义的时候就已经加!了
if optValue != nil {
print("仍然可以判断隐式解析的可选类型是否包含值")
}
if let defiValue = optValue {
print("也可以在可选绑定中 使用隐式解析可选类型来检查值:\(defiValue)")
}
//=================================可选绑定=================================
//判断可选类型是否包含,如果包含值就把值赋值给一个临时常量或变量
var optNum: Int?
optNum = 134
if let actuNum = optNum { //如果optNum 有值,会赋值给actuNum,在该代码块中可以使用
print("optNum有值:\(actuNum)")
}else{//如果没有值,进入这里 相当于actuNum没有定义
print("可选值optNum没有值")
}
//可以有多个可选绑定在一个if语句中,中间只需要用逗号来分割,每个逗号都相当于一个条件
if let num1 = Int("4"),let num2 = Int("张"),num1 < num2 {//第一个条件就相当于判断Int("4")是不是为nil,如果为nil就为flase
print("三个条件都不为nil:\(num1,num2)")
}else{
print("三个条件中有不成立的条件")
}
//=================================错误处理=================================
//可能抛出错误的函数
func makeASandwich() throws {
//一个函数可以通过在声明中添加throws关键词来抛出错误消息。
}
do {
try makeASandwich()
print("如果没有错误会走这")
} catch {
print("有错误会走这,catch后面可以跟一下具体的错误信息,类似于switch的case,可以有很多个catch条件")
}
//使用断言进行调试
let myAge = 3//如果这个值是负数,下一句就会报错
assert(myAge >= 0, "一个人的年龄不可能小于0岁")//断言,就相当于一个报错机制,如果条件符合就不会报错,条件不符合会立刻报错
if myAge > 0 {
print("这个是大于0岁的年龄")
}else{
assertionFailure("一个人的年龄不可能小于0岁")//断言失败
}
//强制执行先决条件
func toBool(x: Int) -> Bool {
precondition(x == 0 || x == 1, "此函数只能将0或1转换为布尔函数。")//判断传入的值是否符合条件,如果不符合就会报错
if x == 0 {
return false
}
return true
}
let ttttt = toBool(x: 0)
//let tt = toBool(x: 3)//传入非0、1的参数就会报错
网友评论