结构体
struct touchPoint {
var x : Double
var y : Double
}
// 定义函数
func Range(point : touchPoint) -> Bool {
let tempX = point.x - startX
let tempY = point.y - startY
// sqrt(n)用来计算n的平方根
// pow(x, n)用来计算x的n次方
let range = sqrt(pow(tempX, 2) + pow(tempY,2))
return range > 50
}
// 创建结构体
let start = touchPoint(x:53.0, y:21.0)
let end = touchPoint(x: 120.0, y: 320.0)
// 调用函数
Range(point) // 结果:true
- 结构体增强
- 扩充构造函数
- 默认情况下创建touchPoint时使用touchPoint(x:,y:)
- 为了更加灵活地使用结构体,swift支持对构造函数进行扩充
- 在扩充的构造函数中必须保证成员变量有值
- 扩充的构造函数会覆盖原有的构造函数
截止至:5.17 —— 1:00 5.18继续
类的定义
- swift也是面向对象开发的语言,而面向对象的基础是类,由类产生对象
- 在swift中定义类使用
class
关键字
- 类的注意点:
- 定义的类可以没有父类,也就是这个类就是rootClass
- 一般情况下,定义类的时候,继承自NSObject(但并不是OC中的NSObject)
格式:class 类名 : 父类 {
属性,方法
}
- 类的属性
- siwft中类的属性分为:
- 存储属性: 存储实例常量和变量的属性
- 类属性:与整个类自身相关的属性
- 计算属性:通过某些算法计算出来的属性
- 存储属性
- 存储属性是最简单的属性,作为类实例的一部分,用于存储变量和常量
- 可给存储属性提供默认值,也可以在初始化方法中对其进行初始化
// 定义person类
class person: NSObject {
// 定义存储属性
var name : String? // 名字
var age : Int = 0 // 年龄
}
// 创建person对象
let ps = person()
// 给存储属性赋值
ps.name = "stephen"
ps.age = 23
- 类属性
- 类属性是与类相关联的属性,但不是与类实例相关联的属性
- 所有的实例和类共有一份类属性,所以只要有某一处修改,这个类的属性就会被修改
- 类属性的设置和修改必须通过类来完成
- 类属性使用
static
来修饰
// 定义person类
class person: NSObject {
// 定义存储属性
var name : String? // 名字
var age : Int = 0 // 年龄
// 类属性
static var nickName : String?
}
// 设置类属性值
person.nickName = "laoWang"
// 打印
print(person.nickName!) // 结果:laoWang
- 计算属性
- 计算属性并不会存储实际的值,而是提供一个getter和一个setter(可选类型)间接获取和设置其它属性
- 一般情况下,只会提供getter方法,这种情况下的计算属性为只读属性,可以省略 get{}
// 定义person类
class person: NSObject {
// 定义存储属性
var foodIntake : Double = 0.0 // 人的食量(一顿吃几碗)
var consume : Double = 0.0 // 消耗量
// 定义计算属性(差值)
var difference : Double {
get {
return (foodIntake - consume)
}
// newValue是系统自动分配的变量名,内部用来存储新的值
// 里面放的是get方法里面计算的值
set {
self.difference = newValue
}
}
}
// 创建person对象
let ps = person()
ps.foodIntake = 50 // 吃的有点多肯定比我胖
ps.consume = 25 // 消耗这么多惊呆小伙伴,看来是个肌肉男
// 打印
print(ps.difference) // 结果 25.0
类的属性改变监听
- OC里面我们可以重写set方法来监听属性值的改变
- swift则需要通过属性观察者来监听和相应属性值的变化
- 一般只会监听存储属性和类属性改变,计算属性我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应其值得变化
- swift使用下面的观察方法定义观察者
- willSet:在属性值被存储之前设置(新值会通过常量参数的方式传入,这个参数就是
newValue
,我们可以给这个参数定义参数名,但一般保持默认)
- didSet:新值被存储后立即调用这个方法,和willSet相同,这时传入的值是属性的旧值,默认的参数名叫
oldValue
- willSet和didSet只在属性第一次被设置的时候才会调用,初始化的时候并不会调用这2个监听方法
class person: NSObject {
var name : String? {
willSet (newValue) { // 属性即将改变时调用
// 会传入系统默认的属性newValue,用来存储新值
print("name:\(name), newValue:\(newValue)") // 结果:name:nil, newValue:Optional("laoWang")
}
didSet (oldValue) {
// 会传入系统默认的属性oldValue,用来存储旧值
print("name:\(name), oldValue\(oldValue)") // 结果:name:Optional("laoWang"), oldValuenil
}
}
}
// 创建person对象
let ps : person = person()
ps.name = "laoWang"
类的构造函数