在闭包之外使用“自我”有明显的好处吗?

时间:2018-10-08 23:02:11

标签: ios swift self

我注意到,即使没有明确要求(例如,在闭包之外),业内的一些人也会使用 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
    }
}

在运行时方面是否对此有明显好处?还是这纯粹是一种风格选择?

4 个答案:

答案 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)

是的,有一些好处。

  • 使用诸如selfinitSwift之类的关键字可防止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。由于某些原因。

  1. 它告诉我,作为开发人员,因为self是必需的,所以我们明确处于封闭状态。
  2. self在闭包中非常重要,让我们知道在强烈捕获self时可能的保留周期和内存泄漏。
  3. 当不在闭包中,在相同或不同范围内没有多个同名变量时,这是多余的。

我要说的一件事是,在进行编码时,使用self.是查看我们所在的类或结构中可用内容的快速方法。但是,找到所需内容后,我将其删除。