9.类析构方法(deinit)的使用
//系统会自动释放不再需要的实例,以释放各种资源,在一个类的实例被释放之前,析构函数会被调用
class
{
var name: String
var age: Int
init(name: String, age: Int)
{
self.name
self.age = 0
}
func
{
print("I am \(name).")
}
//使用关键词deinit来定义析构函数,析构函数是在实例释放发生之前被自动调用的
deinit
{
print("I'm deinited")
}
}
var animal5: Animal4? = Animal4(name: "Jerry", age: 33)
animal5?.say()
animal5 = nil
10.给类添加下标(subscript)
//下标是访问集合、列表、序列中的元素的快捷方式,结构体、枚举和类都可以定义下标。
class
{
var name: String = "Rocky"
var age: Int = 20
var height: Double = 130
subscript(index: Int) -> AnyObject //添加一个下标操作,该下标拥有一个整型参数,并返回任意类型的对象。
{
switch
{
case 0:
return name as AnyObject
case 1:
return age as AnyObject
case 2:
return height as AnyObject
default:
return name as AnyObject
}
}
}
let person5 = Person2()
person5[0]
person5[1]
person5[2]
11.类的静态方法(class func)
//类的静态方法,也称为类型方法。实例方法是被类型的某个实例调用的方法,而静态方法则是被类型本身调用的方法。
class
{
func
{
print("Caculating...")
}
func sum(num1: Int, num2: Int) -> Int
{
alert()
return
}
//使用关键词class定义一个静态方法
class func multiply(num1: Int, num2: Int) -> Int
{
return
}
}
let tool = MathTool()
tool.sum(num1: 1, num2: 1)
//当需要调用静态方法时,需要使用类型而不是实例。静态方法使用方便,项目中的工具类,往往包含大量的静态方法。
MathTool.multiply(num1: 2, num2: 3)
12.讲一个类的实例作为另一个类的属性
class
{
var name: String = "Lovely Dog"
var age: Int = 1
}
class
{
var name: String = "Jerry"
var age: Int = 33
lazy var pet: Animal5 = Animal5() //初始化一个懒加载的属性,具有懒加载特性的对象,只有在使用到它时,才会真正被加载到内存中。
}
var person7 = Person3()
person7.age = 11
person7.pet = Animal5()
person7.pet.name = "Sweety Cat"
person7
13.类的继承以及方法的重写(override)
//一个类可以继承另一个类的方法、属性和其他特性。当一个类继承其他类时,继承类叫子类,被继承类叫父类。继承是区分类和其他类型的一个重要特性。
class
{
func
{
print("I'm animal.")
}
}
//父类的名称位于子类名称的后方,并用冒号进行分割
class Dog: Animal6
{
var name: String
init(name: String)
{
self.name
}
//子类可以为继承来的实例方法、静态方法、实例属性或下标,提供自己定制的实现。我们把这种行为叫做重写。
override func say()
{
super.say()
print("I'm a dog, my name is \(name).")
}
}
var dog = Dog(name: "Nono")
dog.say()
14.父类在实例类型转化时的应用
class
{
var name: String
init(name: String)
{
self.name
}
}
class Dog1: Creature
{
var master: String
init(name: String, master: String)
{
self.master
super.init(name: name)
}
}
//创建作为父类的生物类型的数组
let creatures:[Creature] =
[
Dog1(name: "Nono", master: "John"),
Dog1(name: "BAILEY", master: "Smith"),
Dog1(name: "TOBY", master: "Bill")
]
for object in creatures
{
//通过as!标识符将遍历到的元素,将他们的类型从父类,强制转换为子类的类型。
let dog = object as! Dog1
print("Dog: '\(dog.name)', belongs to \(dog.master)")
}
for dog in creatures as! [Dog1]
{
print("Dog: '\(dog.name)', belongs to \(dog.master)")
}
15.使用is语句检查实例的类型
//类型检查是一种检查类实例的方式,并且也是让实例作为它的父类或者子类的一种方式
//类型检测使用is和as操作符实现。这两个操作符提供了一种简单达意的方式,去检查值的类型或者转换它们的类型。
class
{
var name: String
init(name: String)
{
self.name
}
}
class Dog2: Creature1
{
var master: String
init(name: String, master: String)
{
self.master
super.init(name: name)
}
}
class Bird: Creature1
{
var food: String
init(name:String, food: String)
{
self.food
super.init(name: name)
}
}
let creatures1:[Creature1] =
[
Dog2(name: "Nono", master: "John"),
Bird(name: "MAX", food: "Bugs"),
Dog2(name: "BAILEY", master: "Smith"),
Bird(name: "CHARLIE", food: "Spider"),
Dog2(name: "TOBY", master: "Bill")
]
var dogCount = 0
var birdCount = 0
for item in creatures1
{
if item is Dog2
{
dogCount += 1
}
else if item is Bird
{
birdCount += 1
}
}
dogCount
birdCount
for item in creatures1
{
if let dog = item as? Dog2
{
print("Dog: \(dog.name), belongs to \(dog.master)")
}
else if let bird = item as? Bird
{
print("Bird: '\(bird.name)', loves \(bird.food)")
}
}
16.使用Any表示任意值类型
//Anyobject可以代表任何class类型的实例。此外还有一个Any,它可以表示任何类型,除了方法类型。
var anythings = [Any]() //定义一个Any类型的数组,该数组可以装载各种类型的数据。
anythings.append(8)
anythings.append(3.14156)
anythings.append("hello")
anythings.append((3.0, 5.0))
anythings
for item in anythings
{
switch
{
case let someInt as Int:
print("An integer value of \(someInt)")
case let someDouble as Double:
print("A double value of \(someDouble)")
case let someString as String:
print("A string value of \(someString)")
case let (x, y) as (Double, Double):
print("An (x, y) point at \(x), \(y)")
default:
print("Something else")
}
}