//: Playground - noun: a place where people can play
import Cocoa
***************************结构体与Class类的初始化器//
*************************结构体初始化器///
定义一个结构体
回顾下,什么是存储属性?什么是计算属性?
//***存储属性
swift代码:
//语法形式一:
//在定义的属性时,指定属性名和属性类型,同时赋值,即使是先定义再赋值,这就是存储属性
let test = "xxx"
var test2 :Bool = false
//语法形式二:
//在定义属性时,同时声明属性观察者,这也是存储属性的定义
var test3 :Int?{
didSet{}
willSet{}
}
//***计算属性
swift代码:
//语法结构:
var test5 :Bool? {
get{
return false
}
set{
print("这里是一个计算属性test5")
}
}
定义一个结构体,里面使用初始化器
********************结构体的初始化器
定义一个结构体
swift代码:
struct testStruct1{ //定义属性和方法 //let name :String? = "undefined" let name :String? var status :Bool? func loveAffair() -> Bool{ let laStauts :Bool = true print("我和\(name)恋爱了?") return laStauts } } //看看若结构体在定义时没有指定初始化器 //看效果是怎么样的 let demo = testStruct1.init(name: "Linda",status: true) demo.name demo.status demo.loveAffair()
运行结果:
"Linda" true 我和Optional("Linda")恋爱了?
/*
效果:
当在定义结构体testStruct1时,定义的属性是可为空类型
这个就没什么好说了,可为空类型在后面可以使用!感叹号强制转换回初始定义属性时的具体类型
结构体内,有定义着一个方法,loveAffair方法的返回类型为布尔
loveAffair方法中输出了一句话,并且返回一个值
结构体中,属性定义的是可为空类型,有一个函数,
而定义的可为空类型的属性并没有赋initValue
也并没有声明一个初始化器
因此,testStruct1结构体的实例会提示你使用init初始化器初始化这个结构体,是系统的
*/
//****************那就装配一个初始化器给它咯
//定义结构体testStruct2
swift代码:
struct testStruct2{ //定义属性跟方法 var name :String? var age = 21 var sex :String? //给上面可为空类型赋初始值 //name! = "Jason" //sex! = "仙" /*在结构体中定义属性,要么在定义的同时赋初始值,要么在初始化器中搞定*/ //声明出当前结构体的初始化器 //一个初始化器 init(name :String,sex :String) { self.name = name self.sex = sex } //二个初始化器 init(age :Int) { self.age = age } func introduce(){ print("大家好,我是\(sex),名字叫\(name),今年有\(age)岁了。") } } //拿到testStruct2结构体的一个demo let demo2 = testStruct2.init(name: "Tom", sex: "魔") demo2.introduce()
//二个demo let demo3 = testStruct2.init(age: 6) demo3.introduce()
运行结果:
"Tom"
"魔"
大家好,我是Optional("魔"),名字叫Optional("Tom"),今年有21岁了。
nil
nil
大家好,我是nil,名字叫nil,今年有6岁了。
//**************定义结构体testStruct3
swift代码:
struct testStruct3{
//定义属性时,同时赋值,initVAlue
var name :String? = "Jack"
var age :Int? = 19
var sex :String? = "妖"
func playMusic() -> Void {
print("我要喊麦了!闪开!!")
}
}
//拿到testStruct3的demo、
//let demo5 = testStruct3.init()
let demo5 = testStruct3.init(name: "Linda", age: 21, sex: "不男不女")
demo5.name
demo5.age
demo5.sex
demo5.playMusic()
运行结果:
"Linda"
21
"不男不女"
我要喊麦了!闪开!!
/* !!!!!!!!!!!!!!!!!!!!!!!!!
以上代码效果展示,在结构体中,当所有的存储属性都给了初始值,
在拿到结构体demo时,会有两个系统给出的初始化器
一个无参的
一个有参的
要想调用自己定义的初始化器,就需要自己在结构体中声明自定义初始化器
!!需要一个前提,就是结构体中定义的所有存储属性必须要有一个或一个以上的存储属性不给initVAlue
这样,在拿到结构体demo时才可以调用到在结构体中声明的自定义初始化器
所以,结构体中定义的所有存储属性中,必须要有一个或者一个以上的存储属性不赋初始值
拿到结构体demo时,才可以调用在结构体中声明的自定义初始化器
这样做,系统的那个无参初始化器就没有了,想要的话还得自己声明一个
over
!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
//*******************定义结构体testStruct5
swift代码:
struct testStruct5{ var name :String? = "张三" var age :Int? = 0 var sex :String? = "妖"
//结构体中所有存储属性都赋了初始值initValue //因此在拿到这个结构体demo时,就没有初始化器拿来用 //所以想要在拿到demo时需要调用初始化器,就必须在结构体中自定义初始化器
//定义一个无参的初始化器 init(){ } init(name :String) { self.name = name } init(name :String,age :Int){ self.name = name self.age = age } init(name :String,age :Int,sex :String){ self.name = name self.age = age self.sex = sex } //定义一个方法 func kiss(){ print("\(name)打了一个kiss手势") } } //拿到testStruts5结构体的demo //testStruct5(). //拿到testStruct5的demo let demo6 = testStruct5.init(name: "Jason", age: 16) demo6.kiss() //let demo7 = testStruct5.init(name: String, age: Int, sex: String)
/*
总结:
1> 结构体中所有存储属性都没有赋初始值且都是可为空类型,不声明自定义初始化器,拿到结构体demo时会有一个系统的带参初始化器
2> 结构体中定义的所有存储属性(或者可为空类型的),有一个或一个以上的存储属性赋了初始值initValue,不声明自定义初始化器,拿到结构体demo时会有一个系统不带参初始化器
3> 在结构体中声明自定义初始化器,系统的无参初始化器会消失,拿到结构体demo时,只可用声明的自定义初始化器,要想调用无参初始化器,需要自己再定义一个
*/
----------------------------------------------over