目录:
1.继承:重写等
2.构造过程:指定构造器、便利构造器、可失败构造器、必要构造器等
//1.继承
//重写
class Animal
{
var age:Int = 0;
var weight:Double = 0.0;
func shout()
{
print("animal shout!");
}
};
class Dog : Animal
{
var shoutContent:String
{
return "Dog bark!";
}
override func shout()
{
print(shoutContent);
}
};
var dog = Dog();
dog.shout();
//重写属性getter和setter以及属性观察器
class Person
{
var name: String; //存储属性
var age: Int ; //存储属性
var height: Double;
func description() -> String
{
return "\(name) 年龄是: \(age),高度是:\(height)";
}
init (name: String, age: Int ,height: Double)
{
self.name = name;
self.age = age;
self.height = height;
}
}
class Student: Person
{
var school: String;
override var height: Double
{
willSet
{ //如果只关注修改之前的调用,可以只重写willSet观察者
print("学生身高新值:\(newValue)");
}
didSet
{ //如果只关注修改之后的调用,可以只重写didSet观察者
print("学生年身高旧值:\(oldValue)");
}
}
override var age: Int
{ //重写属性前面要添加override关键字
get
{
return super.age;
}
set
{
super.age = newValue < 8 ? 8: newValue;
}
}
convenience init()
{
self.init(name: "Tony", age: 18,height: 172, school: "清华大学");
}
init (name: String, age: Int,height: Double, school: String)
{
self.school = school;
super.init(name: name, age: age,height: height);
}
}
let student = Student();
student.height = 175;
//防止重写:在属性前加上final
//2.构造过程
//存储属性的构造:默认属性值、构造器
class TestClass
{
var name: String; //存储属性
var age: Int ; //存储属性
var temperature = 32.0; //默认属性值
init (name: String, age: Int)//构造器
{
self.name = name;
self.age = age;
}
};
//带外部和内部参数名的构造器和不带外部参数的构造器、可选属性、构造器改变常量属性值
class TestClass2
{
var temperatureInCelsius: Double = 0.0;
var response: String?;//可选属性,默认初始化为nil
let text: String;
init(fromKelvin kelvin: Double)//带外部参数名
{
temperatureInCelsius = kelvin - 273.15;
self.text = "tst";//构造器内部可以初始化let常量属性,改变常量值
}
init(_ celsius: Double)//不带外部参数名
{
temperatureInCelsius = celsius;
self.text = "tst";//构造器内部可以初始化let常量属性,改变常量值
}
};
//类的继承和构造过程
class Vehicle
{
var numOfWheels:Int = 0;
var description:String
{
return "\(numOfWheels) wheels!";
}
}
class Bicycle : Vehicle
{
override init()
{
super.init();
numOfWheels = 2;
}
};
var bicycle = Bicycle();
print("\(bicycle.description)");
//指定构造器:能调用父类Init,不能调用本类的其他init构造器
//便利构造器(convenience):内部可调用其他init构造器,包括父类的init
//指定构造器和便利构造器
class Food
{
var name:String;
init(name:String)
{
self.name = name;
}
convenience init()
{
self.init(name:"[Unnamed]");
}
}
let namedMeat = Food(name: "bacon");
let unNamed = Food();
class Milk : Food//继承父类的所有指定构造器和便利构造器
{
var quantity : Int;
init(name:String,quantity:Int)
{
self.quantity = quantity;
super.init(name: name);
}
override convenience init(name:String)
{
self.init(name:name,quantity:1);
}
}
let milkQuantity = Milk(name:"[milk]",quantity: 2);
milkQuantity.name;
milkQuantity.quantity;
//可失败构造器
class Car
{
let name:String;
init?(name:String)
{
self.name = name;
if(name.isEmpty)
{
return nil;
}
}
}
let testCar = Car(name:"");//nil
class Product
{
let name: String!;//name 属性有个默认值 nil
init?(name: String)
{
self.name = name;
if name.isEmpty { return nil; }
}
}
let product = Product(name:"");
product?.name;
//可失败构造器 init!()
//必要构造器:require,所有子类必须重写该构造器
class SomeClass
{
required init()
{
// 在这里添加该必要构造器的实现代码
}
}
class SomeSubclass: SomeClass
{
required init()//不需要override
{
// 在这里添加子类必要构造器的实现代码
}
}
//通过闭包和函数来设置属性值