01.常量与变量
·let定义常量,一经赋值不允许再次修改
·var定义变量,赋值之后仍然可以修改
定义常量:let 常量名 = 值
eg. let n = 10
定义变量:var 变量名 = 值
eg. var m = 20
02.类型推导和类型转换
·swift对数据类型要求非常严格
·swift能够自动根据等号右边的代码,推导出变量的数据类型
·如果需要指定变量的数据类型,可以在变量名后使用‘ : 数据类型 ’
eg. let x: Double = 10
tip:Option + Click可以查看变量的类型
note:如果要对不同类型的数据进行计算,必须做显示的类型转换
03.字符串String
·String是一个结构体,性能优于NSString
·String支持直接遍历
·String具有NSString的绝大多数功能
·String与NSString转换方便
定义字符串:var str = "Hello world"
遍历字符串中的字符:for char in str.characters {...}
字符串的长度:let length = str.characters.count
字符串拼接:let str = "Hello"+"World"
把其他类型的数据转成字符串:
let num = 5
let str = "\(num)"
格式化字符串:
let pi = 3.1415926
let str = String(format: "%.02f", arguments: [pi])
04.Optional可选类型
·定义变量时,在类型后面添加一个‘ ? ’,表示该变量是可选类型
·可选类型表示该变量可能有值,也可能为nil,默认值是nil
·在变量后添加一个‘ ! ’,表示强行解包
note:强行解包必须确保解包后的值不是nil,否则会报错
let num: Int? = 10
let sum = num! + 20
可选绑定:当可选有值时,进行赋值;可选为nil时,执行else代码
if let number = num {
print(number)
} else {
print("num为nil")
}
05.if条件分支
·在swift中没有非0既真、0为假,swift中Bool类型只有两个值:true/false
·条件必须是Bool类型,或返回Bool类型的表达式
·条件可以省略括号
eg. if score > 60 { print("及格") }
06.循环
·a...b 闭合范围,表示a到b,[a, b],包含a,也包含b
·a..<b 半闭合范围,表示a到b,[a, b),包含a,不包含b
eg. for i in 0...5 { ... }
tip:‘ _ ’表示忽略对应位置的值 for _ in 0...5 { ... }
07.switch
·swift的switch执行完一个case后默认不执行下一个case
switch(score/10) {
case 9 : print("优秀")
case 8 : print("良好")
case 7 : print("中等")
case 6 : print("及格")
default : print("不及格")
}
·如果需要执行下一个case需要使用fallthrough关键字
·swift可以对Float,Bool,String,Int,枚举进行匹配
·必须处理所有可能的情况,不然编译器会报错,不处理的条件可以放在default分支中
08.数组
·swift定义数组
var array = ["BMW", "BENZ", "RR"]
var array1 = [3, 5, 7, 9]
·初始化空数组
var array2: [Int] = []
var array3 = [Int]()
·遍历数组
for n in array { ... }
09.元组
·元组是由2个或以上元素组成的复合类型,元组中每个元素的数据类型都可以不同
·元组定义好后不能添加或减少元素
定义一个元组:let car = (50000, "white", "BMW")
元组访问:car.0
定义元组时,指定元素名称:var car = (price: 50000, brand: "BMW", color: "white")
元组通过元素名称访问:car.brand
修改元组中元素的值:car.color = "yellow"
10.字典
定义字典:var dict = [String: Int]()
字典的遍历:
遍历字典所有的key:for key in dict.keys { ... }
遍历字典所有的value:for value in dict.values { ... }
遍历key和value:for (k, v) in dict { ... }
赋值直接使用dict[key] = value格式
如果 key 不存在,会设置新值
如果 key 存在,会覆盖现有值
11.枚举
·定义枚举类型:
enum Season {
case Spring
case Summer
case Autumn
case Winter
}
·定义一个枚举变量:var season = Season.Spring
12.函数
·函数的定义
func 函数名(形参1: 类型1, 形参2: 类型2, ...) -> 返回值 { ... }
·外部参数名:在形参名前再增加一个外部参数名,能够方便调用人员更好地理解函数的语义
func addStudent(stu_name name: String, stu_age age: Int, stu_number number: Int) { ... }
·函数返回元组
func getStudent() -> (String, Int, Int) { ... }
13.闭包
·闭包类似于 OC 中的 Block,是一段预先定义好的代码,在需要时执行
·闭包表达式格式:
{ (形参名称1: 形参类型1, 形参名称2: 形参类型2, ...) -> 返回值 in //要执行的代码 }
·定义闭包:var closure = { (text:String) ->Void in }
·执行闭包:closure("学习闭包")
14.类的定义
·()里面是空,表示调用类的默认构造函数 = [[类名 alloc] init];
·swift中访问属性通过点语法来访问,方法也是通过点语法来调用
·继承和OC一样,通过 : 来继承,swift也只有单继承
class类名: 父类名{ //: 一些属性//: 一些方法 }
note:覆盖父类方法, 需要加关键字override
实例化类:var man = Person()
15.类的属性
·存数型属性: 存储数据
属性监视器: 当存储型属性发生改变的时候,通知我们属性发生了改变
willSet: 在属性将要发生改变时调用
didSet: 在属性已经发生改变时调用
·计算型属性: 不存储任何数据,通过get方法来返回一个计算好的数据,通过set方法来设置一个存储型属性的值,当只提供get方法时,称之为只读计算属性,必须要有get方法
var height =1.74
var heightCM: Double {
get {
return height *100
}
set {
height = newValue / 100
} }
16.构造函数
classPerson {
var name: String
}
·以上代码会报:“存储型属性没有初始化值”,原因是在swift中类实例化后,所有的存储型属性必须有值
·解决方法1:定义属性时赋值
·解决方法2:将对象属性类型设置为Optional
利用init函数为属性初始化
·在swift中对象是通过构造函数来实例化的。构造函数的作用:在对象实例化过程中给所有的存储型属性设置初始值,并且执行必要的准备和初始化任务
class Person: NSObject {
var name: String
var age: Int
override init() {
name ="LDH"
age =22
} }
重载构造函数
·swift 中支持函数重载,同样的函数名,不一样的参数类型
init(name: String, age: Int) {
self.name = name
self.age = age }
子类构造函数
·自定义子类时,需要在构造函数中,首先为本类定义的属性设置初始值
·再调用父类的构造函数,初始化父类中定义的属性
·如果子类没有去实现构造函数,会继承父类的构造函数
·如果子类实现了构造函数,不会继承父类的构造函数
init(name: String, age: Int, grade: String) {
self.grade = grade
super.init(name: name, age: age) }
convenience 构造函数
tip:便利构造函数: 它是辅助性的构造函数,方便创建对象
·默认情况下,所有的构造函数都是指定构造函数Designated
·convenience关键字修饰的构造方法就是便利构造函数
·便利构造函数可以返回nil
·需要调用本类的一个指定构造函数
convenience init?(name: String, age: Int) {
if age <0 || age >120 {
print("年龄不合法")
return nil }
self.init(name: name, age: age) }
构造函数小结
1.不需要func关键字,名称是固定的,都叫 init
2.当类没有实现构造函数时,系统会添加一个默认的构造函数
3.如果实现了构造函数,系统就不会添加默认构造函数
4.如果子类没有实现构造函数,会继承父类的构造函数
5.子类构造函数需要调用父类构造函数
6.需要先初始化子类属性,再调用父类构造函数
7.子类一旦实现了构造函数,就不会继承父类的构造函数
17.懒加载
·方法1:lazy var p = Person()
·方法2:
lazy var p: Person= {
let person = Person()
// 此处可以对person属性进行设置
return person }()