第一,结构体声明和构造函数
/** 结构体
* 1,创建结构体变量,结构体的字段都必须有初始值,否则会报错
* 2,结构体内部 只有在构造函数(init)中修改字段的值,在结构体内部中方法和属性内不能直接修改结构体内部字段的值
* 3,在结构体外部,结构体变量,可以访问结构体字段,也可以修改结构体字段的值。
*/
/** 构造函数
* 1,swift语言中指定结构体构造函数,是init方法
* 2,init执行方法,在创建结构体变量之前执行
* 3,在创建结构体题变量的参数必须和构造函数init 参数必须一致
*/
//无参构造函数
struct student {
// 第一种直接定义字段名 并且给字段名赋初始值
var age = 0;
// 第二种定义字段名并且指定字段类型
var name :String; //直接定义一个字符串字段name
//定义 无参数构造函数
init(){
name = "swift";
age = 1;
}
}
//1: student () 创建一个结构体变量 ,系统会自动调用构造函数init()
var stu = student ()
println("name = (stu.name) , age = (stu.age)")
运行结果:name = swift , age = 1
第2,有参数构造函数
/**
* 1,student1 (Name:"swift",Age:0) 创建结构体变量 系统会调动构造函数,并且创建结构体的参数于构造函数参数一致
* 2,student (Name:"swift",Age:0) 后面跟着的参数名称必须于构造函数参数变量名相同
*/
struct student1 {
var age = 1;
var name :String; // 直接定义一个字符串变量。
//定义 有参数构造函数
init(name:String ,age:Int){
//self 指的是当前结构体变量 self.name 当前结构体的变量的字段
self.name = name;
self.age = age;
}
}
//因为构造函数有2个参数,所对应创建结构体的变量的参数要一致
var stu1 = student1 (name: "swift-struct", age: 12)
println("name = (stu1.name) ,age = (stu1.age)")
//运行结果:name = swift-struct ,age = 12
第3,有参数构造函数 参数变量加 _ 用法
/**
* 1,创建结构体的对象中对应参数必须和构造函数对应的参数一致
*
* 2,如果构造函数中参数变量前加 _ 其对应创建对象的参数,不需要变量名
*
* 3,init(_ x :Double ,_ y :Double) 构造函数中对应变量前面加 _ 其对应创建对象后面不需要变量名。
*/
struct Point {
var x = 0.0;
var y = 0.0;
//init(_ x :Double ,_ y :Double) 构造函数中对应变量前面加 _ 其对应创建对象后面不需要变量名。
init (_ x:Double ,_ y:Double){
self.x = x;
self.y = y;
}
}
var p = Point(10.0,11.0)
println("x = (p.x),y =(p.y)")
//运行结果:x = 10.0,y =11.0
第4,结构体方法
struct Test {
//结构体里面有2个字段,一个x,一个y
var x = 0;
var y = 0; //这个=0是初值
//给现有的点,x和y加上一个deltax
//调用的适合obj.addOffset(100,deltay(形参):200);
mutating func addOffset(deltax:Int,deltay:Int){
//因为是结构体是一个拷贝的对象,是引用,从一个结构体复制另一个对象
//mutating这个关键字是告诉可以修改里面的变量
x += deltax;
y += deltay;
}
}
func testStructure(){
//可以改变初值
var s3 = Test();
s3.x = 111;
s3.y = 222;
println("s3.x = (s3.x) s3.y = (s3.y)")
//调用的适合obj.addOffset(100,deltay(形参):200);
s3.addOffset(100 , deltay: 200);
println("s3=(s3.x),s3.y =(s3.y)")
}
//别忘了调用
testStructure();
//运行结果:s3=211,s3.y =422