struct Point {
//结构体中可以定义成员变量
var x: Double = 0
var y: Double = 0
//系统默认创建两个构造方法,用于初始化成员变量
//并且不需要返回,也不需要使用func关键字
//1、无参
init() {
print("无参数构造方法")
}
//2、带参
init(x: Double,y: Double) {
print("成员逐一构造器")
self.x = x
self.y = y
}
init(newX: Double) {
x = newX
}
//结构体中可以定义成员方法
func isOnAxis() -> Bool {
if x==0 || y==0 {
return true
}
return false
}
//除了构造方法,其它方法中不能修改成员变量,除非添加mutating
mutating func changeToOriginal() {
x = 0
y = 0
}
//可以定义结构体方法(不属于任何实例变量,通过结构体名调用,类似于类方法)
static func structFunc() {
print("This is struct function")
}
//可以定义结构体变量(不属于任何实例变量,通过结构体名调用)
static var value: Int = 0
}
//结构体成员逐一构造器
var p1 = Point(x: 100,y: 0)
//若所有成员变量有初值则可以使用无参的形式
var p2 = Point()
p2.x = 10
p2.y = 20
print(p2.isOnAxis())//false
var p3 = Point(newX: 10)
p3.changeToOriginal()
print(p3)//Point(x: 0.0,y: 0.0)
//结构体是值类型
var p4 = Point(x: 100,y: 100) //成员逐一构造器
var p5 = p4
//改变p4的值,对p5没有任何影响
p4.changeToOriginal()
print("p5 = (\(p5.x),\(p5.y))") //p5 = (100.0,100.0)
Point.structFunc() //This is struct function
//调用结构体变量
Point.value = 100
print(Point.value) //100
struct Size {
var width: Double = 0.0
var height: Double = 0.0
}
struct Rect {
//origin和size为存储属性
var origin: Point = Point()
var size: Size = Size()
//center为计算属性(不能存储,是计算得来的)
//若只有getter方法,没有setter方法,则称为只读计算属性
var center: Point {
//getter方法
get {
let x = origin.x + size.width/2
let y = origin.y + size.height/2
return Point(x: x,y: y)
}
//serter方法,newValue是默认的参数名,也可自己指定
set/*(newValue)*/ {
origin.x = newValue.x - size.width/2
origin.y = newValue.y - size.height/2
}
}
func createValue() -> Int {
print("产生随机数")
return Int(arc4random())
}
//延迟存储属性(懒加载)
lazy var lazyValue: Int = self.createValue()
//属性监视器
var property: Int = 0 {
willSet {
print("即将设置")
}
didSet {
print("已经设置")
}
}
}
var rect = Rect() //无参数构造方法
rect.size = Size(width: 100,height: 100)
//在第一次调用的时候才加载
print(rect.lazyValue) //3056669642
print(rect.center)
//成员逐一构造器
//Point(x: 50.0,y: 50.0)
rect.center = Point(x: 100,y: 100)
print(rect.origin)
//测试属性监视器
rect.property = 100
//即将设置
//已经设置