Swift基础(七):继承、构造过程
2016-06-18 15:05
363 查看
目录:
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
{
// 在这里添加子类必要构造器的实现代码
}
}
//通过闭包和函数来设置属性值
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
{
// 在这里添加子类必要构造器的实现代码
}
}
//通过闭包和函数来设置属性值
相关文章推荐
- 编译提示"_sqlite3_column_int", referenced from: 错误 ---swift中添加sqlite报错
- Swift3.0带来的变化汇总系列二——集合类型中的变化
- mac 服务端
- iOS开发系列--Swift 3.0
- iOS开发系列--Swift 3.0
- Swift中的闭包(Closure) 浅析
- Swift optional详解
- Swift 常用字符串操作
- swift学习之路(十八)泛型
- swift2.0 学习笔记Seventeen
- 从零开始学swift 第一篇 环境安装
- swift学习之路(十七)协议
- ReactNative-Cocoapods-Swift-Project
- swift学习03-可选类型Optional
- swift简单瀑布流的实现
- 深入探究Swift数组背后的协议、方法、拓展(转)
- swift 二维码扫描
- 真机调试Swift项目(47K),存储空间占了16M!!!
- 初学swift
- [Swift 开发] 使用闭包传值(typealias)