在这种情况下哪个更好:扩展还是功能?

What is better in this case: extension or function?

我有一个 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
    }
} 

现在需要处理“无效位置”的情况。 这意味着除了可空性检查外,还应执行 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. 运行-time performance:有什么区别(在规模上)吗?

我相信在这种特殊情况下,所有标准都不重要,但如果这个枚举是 public,并称为例如每秒多次,或者在代码库的多个地方,那么我想在做出决定时更有信心。

A classfunc 引用类型 并存储在 上,因此速度较慢使用权。由于类型 Optional 是一个枚举,它存储在 堆栈 中并且可以更快地访问。但在这种情况下,可能不会有明显的区别。做你认为对的事。

如果你想了解内存管理,这里有一篇很好的文章: https://manasaprema04.medium.com/memory-management-in-swift-heap-stack-arc-6713ca8b70e1m

这是关于 stackheap 内存的问题: Swift stack and heap understanding

编辑: 另一个想法是,您的第一种方法将 CLLocationCoordinate2D 作为参数来创建 CLLocationCoordinate2D 的新副本。所以 space 复杂度可能也更大。但如果是这样的话,那就微不足道了。