Есть ли ощутимая польза от использования «я» вне замыканий? - PullRequest
0 голосов
/ 09 октября 2018

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

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

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

Use self только тогда, когда этого требует компилятор (в @ экранирующих замыканиях или в инициализаторах для устранения неоднозначности свойств по аргументам).Другими словами, если он компилируется без self , пропустите его.

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

0 голосов
/ 09 октября 2018

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

  • Привычка от цели-C

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

0 голосов
/ 13 октября 2018

Мое личное соглашение - использовать только self в замыканиях.По нескольким причинам.

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

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

0 голосов
/ 09 октября 2018

Есть.

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