2017-09-13 4 views
1

SO에 관한 다른 질문에 대답 할 때 CLLocation 클래스가 Equatable 프로토콜을 준수한다는 것을 발견했습니다. 평등을 결정하기 위해 어떤 방법을 사용합니까?CLLocation은 Equatable 프로토콜을 어떻게 구현합니까?

위도/경도가 정확히 일치합니까? 위도/경도와 고도가 정확히 일치합니까? 위도, 경도, 고도 및 타임 스탬프가 정확히 일치합니까? 속도와 코스는 어떻습니까? 위도/경도만으로 작성된 객체는 대체로 CLLocation입니까? 위치의 다양한 다른 값은 선택 사항이 아니므로 init(latitude:longitude:)을 사용하여 만든 위치의 고도는 어떻게됩니까? Equatable을 준수하는 클래스와 같은 많은

+0

NSObject에서 상속 한 경우? 두 개의'CLLocation' 객체를 가지고'=='를 호출하려고하면, 사용되는 함수는'NSObject'에 대해 선언 된 함수라는 것을 알 수 있습니다 :'public func == (lhs : NSObject, rhs : NSObject) -> Bool' . 두 개의'CLLocation' 인스턴스를 비교하는 "올바른"방법은 아마도'distance (from :)'를 사용하고 그것을'CLLocationDistance' 임계 값과 비교하는 것입니다. – JAL

+1

평등을 결정하는 데 사용되는 속성을 알고 싶으면 여러 값으로 몇 가지 테스트를 실행하고 결과가 무엇인지 확인해야합니다. – rmaddy

답변

0

CLLocation 클래스의 연산자 (==)

그리고이 코드와 함께 놀이터를 시작하기로 결정 다른 질문에 대한 답변을 구현

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 

및 TRUE를 산출하는 유일한 bool은 bool3입니다.

다른 CLLocation 객체의 개별 속성이 같은지 여부와 관계없이 == 연산자는 객체를 동일하게 간주하지 않습니다. 사용자가 위치를 비교하는 가장 좋은 방법을 추측하는 것은 관심있는 CLLocation 객체의 필드를 비교하는 것입니다.

+0

당신은 loc3을 loc4와 결코 비교하지 않았습니다! –

+0

회전합니다. 하지만 스포일러 경고 false가 – sfbarry14

+0

나는 Objective-C에서 빠른 테스트를했고'CLLocation'이'isEqual :'을 오버라이드하지 않는 것으로 보인다. 두 개의 'CLLocation' 인스턴스는 동일한 인스턴스 인 경우에만 동일합니다. – rmaddy

1

CLLocation은 Equatable 프로토콜을 어떻게 구현합니까?

아니요. 두 CLLocation 인스턴스를 비교하는 재정의 된 == 함수는 없습니다. 이 개 CLLocation 인스턴스 ==를 호출 할 때 NSObject== 기능이 사용됩니다

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

실제로 두 CLLocation 인스턴스를 비교하거나 당신이 걱정하는 각각의 속성 (위도 또는 경도)를 비교하거나, distance(from:) 내장을 사용하려면 방법을 사용하여 두 위치를 비교하고이를 CLLocationDistance 임계 값과 비교하십시오. 그냥 완전히 JAL은 그의 대답에서 말씀하신 것을 확인

0

, 내가 쓴 :

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에서)를 == 클릭 명령을 실행합니다.
open class CLLocation : NSObject, NSCopying, NSSecureCoding { 
... 
} 

그래서 기본적으로 == 그것이 단지 참조를 비교 NSObject에서 서브 클래스 있기 때문에이다 : 나는 CLLocation 클릭 보았다] 명령 한 번 확인하기 위해

extension NSObject : CVarArg { 
} 

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

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

public struct NSZone { 
} 

: 그것은 나를했다.

관련 문제