Swift3 0 Self和self的區別

2021-07-26 05:28:56 字數 1684 閱讀 4247

相信大家都知道self關鍵字的作用, 但你知道swift還有個self關鍵字嗎?

self關鍵字只能用在類裡, 作為函式返回值型別, 表示當前類。

類定義.png

這段**裡有self和self, self指向類自身;self只能作為函式關鍵字, setvalue函式的返回值是classa型別。

我們看到有個warning, 就是setvalue函式的返回值沒有被使用; 這時可以用註解@discardableresult解決。

註解.png

ps: self關鍵字常常和@discardableresult配對使用。

var obja: classa? = classa(a: 1, b: 2)

var objb = obja?.setvaluea(param: 3)

print("obja a: (objb!.a)")

objb = nil

obja = nil

swift的類是引用傳遞, 上面的obja和objb指向同乙個物件, 即引用計數為2, 將2者都設定為nil後立即執行析構函式deinit。

日誌:obja a: 3

classa deinit

參考上面類的寫法,編寫乙個結構體,但結構體不支援self關鍵字! 

struct structa 

@discardableresult

mutating func setvaluea(param: int) -> structa

}var structa = structa(a: 1, b: 2)

var structb = structa.setvaluea(param: 3)

print("structa a: (structa.a), structb a: (structb.a)")

structb.a = 4

print("after set 4, structa a: (structa.a), structb a: (structb.a)")

結構體是值傳遞, setvaluea會新生成乙個相同的例項。

日誌:structa a: 3, structb a: 3

after set 4, structa a: 3, structb a: 4

宣告乙個列舉說明值傳遞。

enum enuma: int 

extension enuma }}

var enuma: enuma = .tuesday

var enumb = enuma.getenum(a: 0)

print("enuma: (enuma.rawvalue), enumb:(enumb.rawvalue)")

enumb = .monday

print("after set monday, enuma: (enuma.rawvalue), enumb:(enumb.rawvalue)")

輸出:

enuma: 1, enumb:1

after set monday, enuma: 1, enumb:0

Self和self的區別

所有的trait都定義了乙個隱式的型別self,它指當前實現此介面的型別。rust官方文件當self用作函式的第乙個引數時,它等價於self self。self引數等價於self self。mut self引數等價於self mut self。方法引數中的self是一種語法糖,是方法的接收型別 例如...

self 和 this 的用法

在訪問php類中的成員變數或方法時,如果被引用的變數或者方法被宣告成const 定義常量 或者static 宣告靜態 那麼就必須使用操作符 反之如果被引用的變數或者方法沒有被宣告成const或者static,那麼就必須使用操作符 另外,如果從類的內部訪問const或者static變數或者方法,那麼就...

顯式self和隱式self的區別

1.class diffself public def method1 puts call method1 enddef method2 puts call method2 self.method1 enddef method3 puts call method3 method1 endend t ...