我注意到,即使没有明确要求(例如,在闭包之外),业内的一些人也会使用 self 关键字。
示例:
import UIKit
import MapView
import CoreLocation
class viewController: UIViewController, MKMapViewDelegate, CLLocationDelegate {
let mapView = MKMapView()
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
self.mapView.delegate = self
self.mapView.showsUserLocation = true
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
}
在运行时方面是否对此有明显好处?还是这纯粹是一种风格选择?
答案 0 :(得分:13)
有。
在您提供的示例中,这没有什么区别,这纯粹是样式选择。有人可能会喜欢它,因为它明确地告诉您您正在修改self
,我个人认为,如果没有,它看起来会更干净。
重要的是具有相同名称的局部变量。假设您有一个具有var count: Int
属性的类。然后,在其中一种方法中,声明一个具有相同名称的新变量。
只要键入count
,就会使用局部变量,因此,如果要修改或读取对象的变量,则需要使用self
。
一些与众不同的例子:
guard let count = calculateCount() as? Int else { return }
self.count = count
init(count: Int) {
self.count = count
}
func updateCount(_ count: Int) {
self.count = count
}
答案 1 :(得分:3)
是的,有一些好处。
self
或init
或Swift
之类的关键字可防止Xcode出现重载歧义就是这样!即使您显式使用它们,编译器出于压缩原因也会从编译的代码中删除它们。但这不受欢迎!都是关于变量和函数的范围。
看看这个例子:
let name = "global variable"
class MyClass {
let name = "object variable"
func testScopes() {
let name = "function local variable"
print(name) //prints: function local variable
print(self.name) //prints: object variable
print(MyProject.name) // prints: global variable
}
}
let myObject = MyClass()
myObject.testScopes()
这是三个具有三个不同有效范围的变量。您可以以不同的方式指代每个人。 Swift社区建议:
为简洁起见,请避免使用 self ,因为Swift不需要它访问对象的属性或调用其方法。
仅在编译器要求时使用 self (在 @转义闭包中,或 在初始化程序中可以消除属性与参数之间的歧义)。其他 话说,如果它编译没有自身,则将其忽略。
但这最终取决于您和您公司的代码风格指南。
答案 2 :(得分:2)
除了出于实际原因,当存在具有相同名称的局部变量或参数时,我之所以这样做是因为以下两个原因:
Objective-C的习惯
它明确地向我(以及其他查看我的代码的人)表明我正在访问属性,而不是局部变量;即。此操作可能会在当前上下文之外产生后果(或受事件影响)。
答案 3 :(得分:0)
我的个人习惯是只在闭包中使用self
。由于某些原因。
self
是必需的,所以我们明确处于封闭状态。self
在闭包中非常重要,让我们知道在强烈捕获self
时可能的保留周期和内存泄漏。我要说的一件事是,在进行编码时,使用self.
是查看我们所在的类或结构中可用内容的快速方法。但是,找到所需内容后,我将其删除。