Что лучше в этом случае: расширение или функция?
У меня есть 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)
}
}
Критерии сравнения:
- семантика: я думаю, № 2 более «быстрый» / выразительный и т. д.
- время компиляции: может ли быть разница (в масштабе)?
- производительность во время выполнения: может ли быть разница (в масштабе)?
Я считаю, что в данном конкретном случае все критерии не важны, но если это перечисление будет общедоступным и будет вызываться, например, много раз в секунду или в нескольких местах в кодовой базе, тогда я хотел бы быть более уверенным при принятии решения.
1 ответ
А
class
а также
func
являются ссылочными типами и хранятся в куче , поэтому доступ к ним медленнее. Так как тип
Optional
является перечислением, оно хранится в стеке , и доступ к нему будет быстрее. Но в этом случае, вероятно, не будет заметной разницы. Делайте то, что считаете правильным.
Если вы хотите прочитать об управлении памятью, вот хорошая статья:https://manasaprema04.medium.com/memory-management-in-swift-heap-stack-arc-6713ca8b70e1m
И вот вопрос о памяти стека и кучи: понимание стека и кучи Swift
РЕДАКТИРОВАТЬ: Другая мысль заключается в том, что ваш первый подход принимает в качестве параметра, который создает новую копию
CLLocationCoordinate2D
. Таким образом, пространственная сложность, вероятно, также больше. Но если это так, мизер.