在这种情况下哪个更好:扩展还是功能?
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)
}
}
比较标准:
- 语义:我猜 #2 更“敏捷”/富有表现力等
- 编译时间:有什么区别(按比例)吗?
- 运行-time performance:有什么区别(在规模上)吗?
我相信在这种特殊情况下,所有标准都不重要,但如果这个枚举是 public,并称为例如每秒多次,或者在代码库的多个地方,那么我想在做出决定时更有信心。
A class
和 func
是 引用类型 并存储在 堆 上,因此速度较慢使用权。由于类型 Optional
是一个枚举,它存储在 堆栈 中并且可以更快地访问。但在这种情况下,可能不会有明显的区别。做你认为对的事。
如果你想了解内存管理,这里有一篇很好的文章:
https://manasaprema04.medium.com/memory-management-in-swift-heap-stack-arc-6713ca8b70e1m
这是关于 stack 与 heap 内存的问题:
Swift stack and heap understanding
编辑:
另一个想法是,您的第一种方法将 CLLocationCoordinate2D
作为参数来创建 CLLocationCoordinate2D
的新副本。所以 space 复杂度可能也更大。但如果是这样的话,那就微不足道了。
我有一个 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)
}
}
比较标准:
- 语义:我猜 #2 更“敏捷”/富有表现力等
- 编译时间:有什么区别(按比例)吗?
- 运行-time performance:有什么区别(在规模上)吗?
我相信在这种特殊情况下,所有标准都不重要,但如果这个枚举是 public,并称为例如每秒多次,或者在代码库的多个地方,那么我想在做出决定时更有信心。
A class
和 func
是 引用类型 并存储在 堆 上,因此速度较慢使用权。由于类型 Optional
是一个枚举,它存储在 堆栈 中并且可以更快地访问。但在这种情况下,可能不会有明显的区别。做你认为对的事。
如果你想了解内存管理,这里有一篇很好的文章: https://manasaprema04.medium.com/memory-management-in-swift-heap-stack-arc-6713ca8b70e1m
这是关于 stack 与 heap 内存的问题: Swift stack and heap understanding
编辑:
另一个想法是,您的第一种方法将 CLLocationCoordinate2D
作为参数来创建 CLLocationCoordinate2D
的新副本。所以 space 复杂度可能也更大。但如果是这样的话,那就微不足道了。