Swift入门之数据类型
Swift包含了C和OC上所有的数据类型:
- OC 基本类型 int CGFloat double NSInteger NSNumber NSString Bool 集合类型:NSArray NSDictonary NSSet
- Swift 对应为Int Float double true fause String 集合类型:Array/Dictonary/Set
Swift新添加数据类型:
- 元组:Tuple,元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以使用一个元组返回多个值.
- 可选类型:Optional,用于处理值缺失的情况.可选表示:那有一个值 ,并且其等于x 或者 那没有值. 有点像OC中的nil,但其可用在任何类型上,不仅仅是类,可选类型比OC中的nil指针更加安全也更具表现力,其是Swift许多强大特性的重要组成部分.
- Swift是一门类型安全的语言.
常量和变量
常量
let nameStr = "mmmm"
变量
var ageNum = 26
可写多个
var ageNum1 = 26,ageNum2 = 27,ageNum3 = 6
类型标注
当你声明常量或变量时 可以加上类型标注,说明常量或变量中存储的值的类型
格式: 在常量或变量后面 添加 : 然后加上类型名称,经验证加空格不可以
let tag3:Int = 300
var tag4:Float = 12.3
var tag1,tag2,tag3:Double
两者的命名
- 可以使用任何你喜欢的字符作为常量或变量的名字,包括Unicode字符甚至表情
- 名字不能包含数学符号 箭头 保留的Unicode码位,连线与制表符
- 不能以数字开头但是其他地方可以使用数字比如中间或末尾
注释
允许注释嵌套注释
分号
- 不强制使用;
- 在同一行内写多条语句时,需加上
整数
- 包括有符号 无符号 零
- Swift提供了8 16 32 64位的有符号和无符号的整数类型,命名方式和C语言的命名很像. Uint8无符号8位 Int32 有符号32位
- Swift提供了一个特殊的整数类型Int,长度和当前平台的原生字长相同.(比如,在32位平台上,Int和Int32长度相同;在64位平台上,其和Int64长度相同),一般来说使用Int足够了.
Uint的小结:
其与Int对比,一般建议使用Int.避免类型转换
浮点数
- 浮点类型比整数类型的范围更大,可存储比Int类型更大或更小的数字
- Swift提供了两种有符号浮点数类型:Double(64位) Float(表示32位浮点数)
整数转换
主要指不同进制之间的相加减时,要转化为数制一致.
let widthNum:Int8 = 1
let heightNum:Int16 = 500
let mySum = heightNum + Int16(widthNum)
//输出的四种表达方式
print(mskWidth,widthNum,heightNum,mySum)
浮点数与整数之间的转换
两者之间转换必须是显式的.
let mskWidth = 10.0
let mmNum = 10
let nnNum = mskWidth + Double(mmNum)
let aaNum = 10.3
let bbNum = 3.9
print(nnNum,Int(aaNum),mmNum + Int(bbNum))
输出结果为 20.0 10 13 取整时 是舍弃小数部分,不存在四舍五入这一说
类型别名(type aliases)
关键字为typealias,用来给现有类型起一个有意义的名字时,就需要他.
typealias AudioSample = Uintbint6
类似OC中的宏 就是替换 便于偷懒个人觉得 哈哈哈
布尔值
true false
元组
Turples 把多个值组合为一个复合值,其内部可以是任意类型,不要求类型相同.
解决了OC时函数只能返回一个值的问题,在OC时解决多个返回值的处理方法时,创建一个可变字典,然后返回字典,再解析即可.
//元组练习
let httpErrorMessage = (404,"Not Found")
print("\(httpErrorMessage.0)",httpErrorMessage.1)
let (statusCode,statusMessage) = httpErrorMessage
print("\(statusCode)","====",statusMessage)
let (justStatusCode,_) = httpErrorMessage
print(justStatusCode)
let http2016Status = (status:2016,message:"OK")
print(http2016Status.status,http2016Status.message)
//输出结果为
404 Not Found
404 ==== Not Found
404
2016 OK
- 元组的元素可以为任意类型,彼此之间没有约束,元素个数不做限制
- 可以通过下标获取元组里面的元素,下标从零开始
- 如果只需要部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记
- 可以给元组里面的单个元素命名,然后可以通过元素名访问元素
元组在临时组织值的时候非常有用,但是不适合创建复杂的数据结构.如果不是临时使用,请使用类或结构体而不是元组.
可选类型(optional)
其用来处理 值 可能缺失的情况,表示:
有值,等于x; 或者 没有值;
- 在OC中,有返回值的函数,其返回值要么是一个对象,要么是nil,表示没有返回值.
- 但对于结构体,OC一般会返回一个特殊值(比如NSNotFound)来表示值缺失
- 在Swift出现了可选类型,其允许你 可以值缺失,但不需要返回一个特殊值表明.
let stringNum = "1245"
let num = Int(stringNum)
print(num)
//输出结果为
Optional(1245)
num被推测为类型”Int?” 或类型”optional Int”,从输出结果也可以看出来.
一个可选的Int值被写作 Int?,问好表示包含的值为可选类型,即可能包含Int值,有可能不包含值,且只能是Int或什么都没有.
nil
其与OC中的nil不一样.OC中nil是一个指向不存在对象的指针.但是在Swift里面,nil不是指针,其用来表示一个确定的值,用来表示值缺失,任何类型的可选状态都被设置为nil,不只是对象类型.
- 可以给可选变量赋值为nil,表示其没有值
- 不能用于非可选变量的常量或变量.
- 如果你声明一个可选的常量或变量,但是没有赋值,会自动被设置为nil
var rightAnswer:String
// rightAnswer被自动设置为Nil
强制解析 !
使用 !来获取一个不存在的可选值会导致运行时错误,所以使用!强制解析值之前,一定要确定可选包含一个非nil得值.
if mmNum! = nil{
}
可选绑定
在if条件语句中使用常量和变量来创建一个可选绑定,仅在if语句的句中才能获取到值.相反,在guard语句中使用常量和变量来创建一个可选绑定,仅在guard语句外且在语句后才能获取到值.
//可选绑定
let nnNumber = "1234String"
if let mmNumber = Int(nnNumber){
print(mmNumber,nnNumber)
}else{
print("\(nnNumber) can not be converted to an Integer")
}
代码解释:
- Int(mm)其返回的内容为可选类型.若mm为数字字符串则返回 可选类型的数字,否则返回nil.
- 再来看上述代码 条件判断 若返回可选的数字 则,将该可选数字赋值给 nnNumber ,然后走
print(mmNumber,nnNumber)
- 若返回的为nil,则走else语句.上述代码最终走else语句.
- 若nnNumber = “1234”,则最终走第一个语句,输出为 1234 1234
隐式解析可选类型
?变为!
错误处理
do catch
断言
断言允许附加一条调试信息
全局assert(::file:line:)函数 可以用来写一个断言.向这个函数传入一个结果为true或false的表达式以及一条信息当表达式的结果为false的时候这条信息会被显示.
let age = -3
assert(age >= 0,"A person's age cannot be less than zero ")
因为age = -3 ,断言会触发