Что лучше в этом случае: расширение или функция?

У меня есть ViewController, где есть логика для «известного» и «неизвестного» местоположения. На высоком уровне это выглядит так:

      class MyViewController {
    private var myVar: CLLocationCoordinate2D? // is updated somewhere

    private var myFunc1() {
        let someCond = myVar == nil // "isLocationUnknown" logic
    }

    private var myFunc2() {
        guard let myVar == nil else { return } // "isLocationUnknown" logic
    }
} 

Теперь есть требование обрабатывать случай «недопустимого местоположения». Это означает, что в дополнение к проверке допустимости значений NULL, CLLocationCoordinate2Dследует выполнить проверку.

И я не могу решить, что лучше ( поскольку я не знаю, где узнать о деталях реализации Swift, кроме чтения исходников :) ):

Подход №1:

      private func isLocationUnknown(_ location: CLLocationCoordinate2D?) -> Bool {
    guard let location = location else {
        return true
    }
    return !CLLocationCoordinate2DIsValid(location)
}

Подход № 2:

      private extension Optional where Wrapped == CLLocationCoordinate2D {
    var isUnknown: Bool {
        guard let self = self else {
            return true
        }
        return !CLLocationCoordinate2DIsValid(self)
    }
}

Критерии сравнения:

  1. семантика: я думаю, № 2 более «быстрый» / выразительный и т. д.
  2. время компиляции: может ли быть разница (в масштабе)?
  3. производительность во время выполнения: может ли быть разница (в масштабе)?

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

1 ответ

А classа также funcявляются ссылочными типами и хранятся в куче , поэтому доступ к ним медленнее. Так как тип Optionalявляется перечислением, оно хранится в стеке , и доступ к нему будет быстрее. Но в этом случае, вероятно, не будет заметной разницы. Делайте то, что считаете правильным.

Если вы хотите прочитать об управлении памятью, вот хорошая статья:https://manasaprema04.medium.com/memory-management-in-swift-heap-stack-arc-6713ca8b70e1m

И вот вопрос о памяти стека и кучи: понимание стека и кучи Swift

РЕДАКТИРОВАТЬ: Другая мысль заключается в том, что ваш первый подход принимает в качестве параметра, который создает новую копию CLLocationCoordinate2D. Таким образом, пространственная сложность, вероятно, также больше. Но если это так, мизер.

Другие вопросы по тегам