目录:
1.析构过程:deinit
2.自动引用计数:用ARC来管理内存
3.类之间的强引用与弱引用、无主引用
4.闭包引起的强循环引用及解决办法
5.可空链式调用:可空链式调用定义类、可空链式设置属性值、可空链式调用方法、通过可空链式调用来访问下标、多层连接、对返回可空值的函数进行链接
//1.析构过程:deinit
class Player {
var coinsInPurse: Int
init(coins: Int)
{
self.coinsInPurse = coins;
print("Player 构造");
}
func winCoins(coins: Int)
{
}
deinit//析构
{
coinsInPurse = 0;
print("Player 析构");
}
}
//2.自动引用计数:用ARC来管理内存
var ref1 : Player?;
var ref2 : Player?;
ref1 = Player(coins: 2);//print("Player 构造");
ref2 = ref1;
ref2 = nil;
ref1 = nil;//print("Player 析构"); 引用计数归0
//3.类之间的强引用与弱引用、无主引用
//4.闭包引起的强循环引用及解决办法
//5.可空链式调用:可空链式调用定义类、可空链式设置属性值、可空链式调用方法、通过可空链式调用来访问下标、多层连接、对返回可空值的函数进行链接
class Address
{
var buildingName: String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String?
{
if buildingName != nil
{
return buildingName;
}
else if buildingNumber != nil
{
return buildingNumber;
}
else
{
return nil;
}
}
}
class Residence
{
var numberOfRooms = 1;
var address: Address?
func printNumberOfRooms()
{
print("The number of rooms is \(numberOfRooms)")
}
}
class Person
{
var residence: Residence?;
}
let john = Person();
//在 residence 后面添加问号之后,Swift就会在 residence 不为空的情况下访问 numberOfRooms
if let roomCount = john.residence?.numberOfRooms
{
print("John's residence has \(roomCount) room(s).");
}
else
{
print("Unable to retrieve the number of rooms.");
}
//可空链式调用定义类
let john1 = Person()
if let roomCount = john.residence?.numberOfRooms
{
print("John's residence has \(roomCount) room(s).");
}
else
{
print("Unable to retrieve the number of rooms.");
}
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
//可空链式设置属性值
john.residence?.address = someAddress;//通过 john.residence 来设定 address 属性也是不行的,因为 john.residence 为 nil
//可空链式调用方法
if john1.residence?.printNumberOfRooms() != nil
{
print("It was possible to print the number of rooms.")
} else
{
print("It was not possible to print the number of rooms.")//打印此行
}
//通过可空链式调用来访问下标
//访问可空类型的下标
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0]++
testScores["Brian"]?[0] = 72 //nil不存在
//testScores ["Bev": [80, 94, 81], "Dave": [91, 82, 84]]
//多层连接
//if let johnsStreet = john.residence?.address?.street {
//对返回可空值的函数进行链接
if let buildingIdentifier = john.residence?.address?.buildingIdentifier()
{
print("John's building identifier is \(buildingIdentifier).")
}
if let beginsWithThe =
john.residence?.address?.buildingIdentifier()?.hasPrefix("The")
{//buildingIdentifier()? ?号在()后表示返回值可为空,不是函数本身
if beginsWithThe
{
print("John's building identifier begins with \"The\".")
}
else
{
print("John's building identifier does not begin with \"The\".")
}
}