Есть ли ощутимая польза от использования «я» вне закрытия?

Я заметил, что несколько человек в отрасли будут использовать ключевое слово 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 ответа


Есть.

В приведенных вами примерах это не имеет значения, это чисто выбор стиля. Некоторым людям это может понравиться, поскольку он явно говорит вам, что вы меняете 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
}

Да, есть некоторые преимущества.

  • Использование ключевых слов, таких как 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 только тогда, когда это требуется компилятором (в @escaping закрытиях или в инициализаторах для устранения неоднозначности свойств из аргументов). Другими словами, если он компилируется без себя, опустите его.

Но в конечном итоге это зависит от вас и руководства по стилю кода вашей компании.


Помимо практической причины, когда это необходимо, когда есть локальная переменная или параметр с тем же именем, я делаю это, потому что по нескольким причинам:

  • Привычка от Objective-C

  • Он явно показывает мне (и всем, кто смотрит на мой код), что я обращаюсь к свойству, а не локальной переменной; то есть. это действие может иметь последствия (или быть под влиянием событий) за пределами текущего контекста.


Моя личная конвенция заключается в том, чтобы использовать self только в закрытии. По нескольким причинам.

  1. Он говорит мне, как разработчику, что мы явно закрыты, потому что требуется я.
  2. self очень важна в замыканиях и позволяет нам знать о возможных циклах удержания и утечке памяти, когда мы фиксируем self сильно.
  3. Это избыточно, если не в закрытии, когда в одном и том же или разных областях нет нескольких переменных с одним и тем же именем.

Одна вещь, которую я скажу, при кодировании, используя self. это быстрый способ увидеть, что доступно в классе или структуре, в которой мы находимся. Однако я удалю ее после того, как найду то, что мне нужно.


Есть идеи?

10000