一、结构体的介绍:
- 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合;
- 结构体(struct)指的是一种数据结构;
- 结构体是值类型,在方法中传值时是值传递。
二、结构的定义格式:
struct 结构体名称{
//属性和方法
}
struct 结构体名称{
//属性和方法
var name:String //name:非可选,永远不能为nil
var age:Int
}
//结构体的创建,会自动生成一个“逐一构造器”
//目的:保证给结构体里面所有的非可选属性赋值,保证肯定有值
let tt = 结构体名称(name: "yijiang",age:12)
tt.name //yijiang
struct Person{
var name: String?
var age: Int?
}
let p1 = Person()
let p2 = Person(name: "sansan", age: nil)
p.age //nil
struct Person{
var name: String
var age: Int?
}
let p = Person(name: "sansan", age: nil)
p.age //nil
//创建p时不能把age省略,除非重写其构造函数
三、应用场景:
struct Point{
var x:Float
var y:Float
}
func getDistance(第一个点 p1:Point,第二个点 p2:Point) -> Float{
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2))
}
let point1 = Point(x: 1, y: 2)
let point2 = Point(x: 4, y: 6)
getDistance(第一个点: point1, 第二个点: point2) //5
四、结构体扩充构造函数:
- 默认情况下,结构体会自动创建一个“逐一构造器”;
- 扩充构造函数:为了让我们在使用结构体时更加的灵活,Swift还可以对构造函数进行扩充;
- 扩充的注意点:
- 创建构造函数,不需要func关键字;
- 在扩充的构造函数中,必须保证非可选成员变量是有值的;
- 扩充的构造函数会覆盖原有的构造函数
struct Student{
var name:String
var age:Int?
//构造函数是系统生成的函数,不需要加 func 关键字
//如果自己扩充构造函数,会覆盖之前自动生成的逐一构造器
//构造函数中必须保证所有的非可选属性有值
init() {
name = "yijiang"
}
init(name:String) {
self.name = name
}
init(name:String,age:Int) {
self.name = name
self.age = age
}
}
let s1 = Student()
s1.name //yijiang
let s2 = Student(name: "jiang")
s2.age //nil
s2.name //jiang
let s3 = Student(name: "YijiangWang", age: 18)
s3.name //YijiangWang
s3.age //18
五、结构体扩充函数:
- 为了让结构体使用更加灵活,Swift的结构体中可以扩充方法;
//结构体扩充函数
struct Location{
var x:Double
var y:Double
//结构体是一个值传递
//默认情况下,是不能改变实例的属性值,如果想要改变,必须要添加mutating关键字,让self实例可以改变里面的值
mutating func moveX(x:Double) {
self.x += x
}
}
var l1 = Location(x: 10, y: 10);
l1.moveX(x: 12)
l1.x //22
//用extension关键字扩充自定义结构体方法
extension Location{
mutating func moveY(y:Double) {
self.y += y
}
}
var l2 = Location(x: 5, y: 6)
l2.moveY(y: 3)
l2.y //9
- 扩充系统的结构体方法:
- 如果我们的结构体不是自己定义的,我们也可以扩充里面的方法,这个机制,叫做extension:
extension String{
func run() -> String{
return self + ",天天向上"
}
}
let str:String = "我要好好学习"
str.run() //"我要好好学习,天天向上"