代码之家  ›  专栏  ›  技术社区  ›  Duncan C

CLLocation如何实现可均衡协议?

  •  5
  • Duncan C  · 技术社区  · 7 年前

    在回答另一个问题时,我发现 CLLocation 类符合 Equatable

    lat/long的精确匹配?纬度/经度和海拔的精确匹配?纬度、经度、海拔和时间戳是否完全匹配?速度和航向呢?那么...怎么样 CL位置 仅使用横向/纵向对创建的对象?位置的各种其他值不是可选值,因此使用 init(latitude:longitude:)

    3 回复  |  直到 7 年前
        1
  •  2
  •   mfaani    7 年前

    import Foundation
    import UIKit
    import CoreLocation
    
    class ViewController: UIViewController{
    
        var cl1 = CLLocation()
        var cl2 = CLLocation()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            if cl1 == cl2{
    
            }
        }
    }
    

    然后我点击命令 == (来自 if cl1 == cl2 ). 这让我想到:

    extension NSObject : CVarArg {
    }
    
    public func ==(lhs: Selector, rhs: Selector) -> Bool
    
    public func ==(lhs: NSObject, rhs: NSObject) -> Bool
    
    public struct NSZone {
    }
    

    CLLocation 然后看到:

    open class CLLocation : NSObject, NSCopying, NSSecureCoding {
    ...
    }
    

    所以基本上 == NSObject 它只比较引用。

        2
  •  2
  •   JAL    7 年前

    怎么做 CLLocation

    没有。没有被覆盖的 == CL位置 实例。呼叫时 CL位置 NSObject ==

    public func ==(lhs: NSObject, rhs: NSObject) -> Bool
    

    实例中,要么比较您关心的每个属性(纬度或经度),要么使用内置 distance(from:) 方法,并将其与 CLLocationDistance 门槛

        3
  •  0
  •   sfbarry14    7 年前

    CLLocation类与任何符合Equatable的类一样,实现了(=)运算符

    import UIKit
    import CoreLocation
    
    var str = "Hello, playground"
    
    var coordinate = CLLocationCoordinate2D.init(latitude: 42.0, longitude: 42.0)
    var accuracy = CLLocationAccuracy.init(24.0)
    var date = Date.init(timeIntervalSinceNow: 0)
    
    var loc1 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, timestamp: date)
    var loc2 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, timestamp: date)
    var loc3 = CLLocation.init(latitude: 42.0, longitude: 42.0)
    var loc4 = CLLocation.init(latitude: 42.0, longitude: 42.0)
    var loc5 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, course: .infinity, speed: 55.0, timestamp: date)
    var loc6 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, course: .infinity, speed: 55.0, timestamp: date)
    
    var bool1 = loc1 == loc2  //false
    var bool2 = loc2 == loc3  //false
    var bool3 = loc2 == loc2  //true
    var bool4 = loc1 == loc4  //false
    var bool5 = loc5 == loc6  //false
    

    唯一的布尔值是bool3。

    因此,无论不同CLLocation对象上的单个属性是否相同,==运算符都不会将对象视为相等。我猜比较位置的最好方法是比较你感兴趣的CLLocation对象的字段