/*
构造方法:
作用: 对实例对象的内容进行初始化
Swift要求类或者结构体中的存储属性(非lazy在)在对象构造完毕后要有初始化值
语法:
init(参数列表){ 初始化代码 }
注意: 1.在Swift中类/结果提/枚举都需要构造方法;
2.构造方法的作用仅仅是用语初始化属性, 而不是分配内容, 分配内存是系统帮我们做的;
3.构造方法是隐式调用的, 通过 类名称() 形成创建一个对象就会隐式调用 init() 构造方法;
4.如果所有的存储属性都有默认值, 可以不提供构造方法, 系统会提供一个隐式的构造方法;
5.如果存储属性可以提供缺省, 那么提倡大家使用设置缺省值的方法, 这样可以简化代码(不用自定义构造方法, 不用写存储属性类型)
*/
class Person {
var name: String = "hjq"
// var age: Int = 20
var age:Int
func description() -> String {
return "name = \(name) age = \(age)"
}
init() {
print("init")
age = 30
}
}
// 1.分配内存; 2.初始化name和age; 3.构造方法是隐式调用的
var p = Person()
var descripString: String = p.description() //显示调用
print(p.age)
print("================================")
/** 带有参数的构造方法 **/
class Person2 {
var name:String
var age:Int
func description() -> String {
return "name = \(name) age = \(age)"
}
//1.构造方法的内部参数, 默认也是外部参数;
//2.而函数的内部参数默认不会当做外部参数;
//3.而方法的内部参数, 从第二个开始才会当做外部参数;
//4.构造方法对属性的顺序没有要求, 只要保证对象构造完时所有存储属性被初始化即可.
init(age:Int, name:String)
{
self.name = name
self.age = age
}
func setName(name:String, age:Int)
{
self.name = name
self.age = age
}
}
var p2 = Person2(age: 25, name: "hjq")
p2.setName(name: "hjq", age: 30)
print(p2.description())
p2.setName(name: "hjq", age: 23)
print(p2.description())
print("================================")
/*
常量存储属性与构造方法
常量存储属性只能通过缺省值或在构造方法中被修改, 其它任何地方都不能修改
*/
class Person3 {
var name:String = "hjq"
var age:Int
init(age:Int, name:String)
{
self.name = name
self.age = age
}
func description() -> String {
return "name = \(name) age = \(age)"
}
}
var p3 = Person3(age: 30, name: "jq")
print(p3.description())
//p3.name = "hello" //常量存储属性初始化之后不允许被修改! 虽没报错,但是不允许,这一点在后面开发中挖掘验证!
print("================================")
/** 可选属性与构造方法 **/
class Car {
let name:String
init(name:String)
{
self.name = name
}
}
class Person4 {
let name:String
var age:Int
var car:Car?
//1.可选值存储属性可以不再构造方法中初始化;
//2.也就是说可选值在对象构造完毕后不用初始化;
//3.其实如果不对可选存储属性进行初始化, 默认就是nil
init(age:Int, name:String)
{
self.age = age
self.name = name
}