swift day 3--自定义类型
Struct - 定制更复杂的类型
表示人名时可能需要两个字符串.Swift允许我们根据实际需要,定义自己的类型系统,并把这种自定义的类型叫做 named types
Swift
中有四种named types
- Struct 结构
- class 类
- enum 枚举
- protocol 协议
struct - value type 表达值型
比如两个无意义的浮点数,组合就可以表达一个点的location,两个点组成的Struct就有值的概念
定义一个struct
let centerX = 100.0
let centerY = 100.0
let distance = 200.0
func inRange(x: Double, y: Double) -> Bool {
//sqrt(n) pow(x, n)
let disX = x - centerX
let disY = y - centerY
let dist =
sqrt(pow(distX, 2) + pow(distY, 2))
//sqrt(n)用来计算n的平方根,pow(x,n)用来计算n次方,它们都是Swift提供的库函数.
inRange(100, y:500)
inrange(300, y:800)
}
初始化struct
struct StructName{/* Struct memberes*/}
Struct Location{
let x: Double
var y: Double
}
let pointA =Location(x: 100, y: 200)
func inPointRange(Location) -> Bool {
//sqrt(n) pow(x, n)
let disX = pointX - centerX
let disY = pointY - centerY
let dist =
sqrt(pow(distX, 2) + pow(distY, 2))
inPointRange(pointA)
之前我们讲函数的时候,说过函数的第一个参数是省略outername的,但是在init里,第一个参数的outername是不会省略的,我们必须指定每一个参数的outername。
Swift在Struct中默认不允许我们在method里修改成员的值,如果我们要修改它,需要在对应的方法前面使用mutating关键字。之后,我们就可以这样
Class
- class类型是一个Reference Type(引用类型)
- class类型没有默认的init方法.如果我们不指定它,swift编译器就会报错.swift要求我们用init方法大招一个对象
- class 它的值不能被改变,不能引用其他class的对象.
- 如果struct中的method要修改其成员,我们要明确把它定义为mutating:
- class必须init初始化
- 值类型的变量赋值,会把变量的值完整的拷贝
- class引用类型的变量赋值,会复制一个指向相同对象的引用,因此修改p2.x会影响p5.x;
- optional is an enum