是的,它是一样的this
在爪哇和self
在 Objective-C 中,但在 Swift 中,self
仅当您从闭包调用属性或方法或区分代码内的属性名称(例如初始值设定项)时才需要。因此,您可以安全地使用几乎所有类组件,而无需使用self
除非你是从闭包中调用的。
“self 属性 类型的每个实例都有一个隐式属性
被称为self
,它与实例本身完全相同。你
使用self
属性来引用其内的当前实例
自己的实例方法。
The increment()
上面例子中的方法可以写成
像这样:
func increment() {
self.count += 1
}
实际上,你不需要写self
经常在你的代码中。
如果你没有明确写出self
,斯威夫特假设你是
每当您引用当前实例的属性或方法时
在方法中使用已知的属性或方法名称。这个假设
是通过使用来证明的count
(而不是self.count
)
在 Counter 的三个实例方法中。
当参数名称为
实例方法与该实例的属性具有相同的名称。在
这种情况,参数名优先,就变成了
有必要以更合格的方式引用该属性。你用
这self
属性来区分参数名称和
属性名称。
Here, self
消除称为方法参数之间的歧义x
和
一个实例属性,也称为x
:”
摘自:Apple Inc.“Swift 编程语言(Swift 2 预发行版)”。
就是这样雷·温德利希建议使用self
在 Swift 中查看他们的教程:
使用自我
为了简洁,避免使用self
因为 Swift 不要求它访问对象的属性或调用其方法。
Use self
当需要区分初始值设定项中的属性名称和参数时,以及根据编译器的要求在闭包表达式中引用属性时:
class BoardLocation {
let row: Int, column: Int
init(row: Int, column: Int) {
self.row = row
self.column = column
let closure = {
println(self.row)
}
}
}
这是GitHub的建议self
对于他们的应用:
仅明确提及self
在需要的时候
当访问属性或方法时self
,留下参考self
默认情况下隐式:
private class History {
var events: [Event]
func rewrite() {
events = []
}
}
仅在语言需要时才包含显式关键字 - 例如,在闭包中或当参数名称冲突时:
extension History {
init(events: [Event]) {
self.events = events
}
var whenVictorious: () -> () {
return {
self.rewrite()
}
}
}
理由:这使得 self 的捕获语义在闭包中更加突出,并避免了其他地方的冗长。