說在前面的話
析構器只適用於類類型,當一個類的實例被釋放之前,析構器會被立即調用。析構器用關鍵字 deinit 來標示,類似於構造器要用 init 來標示。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可選鏈式調用是一種可以在當前值可能爲 nil 的可選值上請求和調用屬性、方法及下標的方法。如果可選值有值,那麼調用就會成功;如果可選值是 nil,那麼調用將返回 nil。多個調用可以連接在一起形成一個調用鏈,如果其中任何一個節點爲 nil,整個調用鏈都會失敗,即返回 nil。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.析構函數
個人理解
當我們需要銷燬一個對象的時候 就需要釋放內存 這時候就會用到析構函數
基本格式
deinit {
// 執行析構過程
}
示例代碼
class xiazai{
var imgs:[String] = []
var file = " "
init!(fileName:String) {
if fileName.isEmpty {
print("文件名不能爲空!")
} else{
self.file=fileName
print("加載成功")
ingDowling()
}
}
deinit {
if imgs.count<0 {
print("數據庫爲空無需釋放資源")
}else{
self.imgs.removeAll()
print("釋放資源成功")
}
}
func ingDowling() {
print("正在下載!")
}
}
var xz = xiazai(fileName: "imgs")
xz?.imgs.append("one")
xz=nil
這裏模仿了一個 數據庫存儲的案例 創建一個下載類 可失敗構造函數 可=和析構函數
當數據庫爲空的時候 可失敗構造函數初始化的時候 作出判斷 ,當我們添加一個元素後 我們把實力化對象 設置爲nil的時候 析構函數 會執行釋放資源成功。
2.可選鏈
Swift 的可選鏈式調用和 Objective-C 中向 nil 發送消息有些相像,但是 Swift 的可選鏈式調用可以應用於任意類型,並且能檢查調用是否成功。
示例代碼
class hero {
var name:String
init(name:String) {
self.name=name
}
var aepaen:aepaen?
}
class aepaen{
var name:String
init(name:String) {
self.name=name
}
var skills:[skill] = [skill]()
subscript (i:Int) -> skill{
get {
return skills[i]
}
set{
skills[i] = newValue
}
}
var skillName:String?{
if skills.count > 0{
return self.skills[0].name
}else{
return nil
}
}
}
class skill{
var name:String
init(name:String) {
self.name=name
}
func skilldesk() {
print("這裏是武器的描述 該技能的name:\(name)")
}
func deskString() -> String? {
return("技能的描述")
}
}
屬性的訪問
if let name = name.aepaen?.skillName {
print("\(name)")
}else{
print("訪問技能名字失敗!")
}
訪問方法使用可選鏈
if (name.aepaen?.skills[0].skilldesk()) != nil {
print("訪問方法成功!")
}else{
print("訪問失敗!")
}
訪問下標使用可選鏈
if let name = name.aepaen?[0].name {
print("訪問武器名字爲 \(name)")
}else{
print("訪問失敗!")
}
訪問返回值使用可選鏈
if let name = name.aepaen?[0].deskString() {
print("訪問武器名字爲 \(name)")
}else{
print("訪問失敗!")
}
爲英雄添加技能:
var name = hero(name: "ssj")
var jn = aepaen(name: "boss")
var jn1 = skill(name: "順手牽羊2")
var jn2 = skill(name: "順手牽羊3")
jn.skills.append(jn1)
jn.skills.append(jn2)
name.aepaen=jn
最後看下運行結果: