2017-12-28 6 views
1

저는 엔티티 차이 알고리즘을 연구 중입니다. 전후의 두 객체간에 변경된 속성을 찾으려고합니다. 두 객체의 값을 비교할 수 있습니까? 둘 다 유형이 Any이며 비교할 수 없습니다.두 객체간에 변경된 속성을 찾습니다.

import Foundation 

class Person { 
    var gender: Gender = .female 
    let dateOfBirth: Date 

    init(dateOfBirth: Date) { 
     self.dateOfBirth = dateOfBirth 
    } 

    class func GetDateFromString(DateStr: String)-> Date 
    { 
     let calendar = NSCalendar(identifier: NSCalendar.Identifier.gregorian) 
     let DateArray = DateStr.components(separatedBy: "/") 
     let components = NSDateComponents() 
     components.year = Int(DateArray[2])! 
     components.month = Int(DateArray[1])! 
     components.day = Int(DateArray[0])! 
     components.timeZone = TimeZone(abbreviation: "GMT+0:00") 
     let date = calendar?.date(from: components as DateComponents) 

     return date! 
    } 

    enum Gender { 
     case male 
     case female 
     case unknown 
    } 


    func update(oldValue: Person?,entity: Person) { 
     if let oldValue = oldValue { 
      let mirror1 = Mirror(reflecting: oldValue) 
      let mirror2 = Mirror(reflecting: entity) 


      for (child1,child2) in zip(mirror1.children,mirror2.children){ 
       if let dob1 = child1 as? Gender, let dob2 = child2 as? Gender { 
        if dob1 == dob2 { 
         print("not equal") 
        } 
       } 
      } 

     } 
    } 

} 

extension Person: Equatable { 
    static func == (lhs: Person, rhs: Person) -> Bool { 
     return lhs.gender == rhs.gender && lhs.dateOfBirth == rhs.dateOfBirth 
    } 
} 




let user1 = Person(dateOfBirth: Person.GetDateFromString(DateStr: "12/1/1987")) 
let user2 = Person(dateOfBirth: Person.GetDateFromString(DateStr: "10/10/1987")) 
user1.gender = .male 
+0

개체에 'Comparable'을 적용합니다. Btw : 함수와 변수 이름이 소문자로 시작하는 명명 규칙을 준수하십시오. 그리고 Swift 3+에서 NSCalendar와 NSDateComponents를 사용할 필요가 없습니다. – vadian

+0

전체 코드에서 수행하려는 작업이 확실하지 않습니다. 그러나'dob1 = child1 as just? '을 변경하면 캐스트가 성공할 것입니다. 성별'로'dob1 = child1.value? 성별' – jpetrichsr

답변

0

당신이 신경 쓰는 것이 평등이면 Equatable 프로토콜을 준수 할 수 있습니다. 비교보다 크거나 작음이 필요한 경우 Comparable을 준수 할 수 있습니다. 다음은 같은 방법으로 사용하는 방법의 예입니다.

extension Person: Equatable { 
    static func == (lhs: Person, rhs: Person) -> Bool { 
     return lhs.gender == rhs.gender && lhs.dateOfBirth == rhs.dateOfBirth 
    } 
} 
+0

어떻게이를 'for (child1, child2) in zip (mirror1.children, mirror2.children) {'? 어떤 속성이 변경되었는지 알고 싶습니다. – DesperateLearner

+0

언제든지 Person에 개체를 캐스팅 할 수 있으며 'if let person1 = child1 as?'와 같은 속성을 직접 확인할 수 있습니다. Person, person2 = child2를? Person ' – jpetrichsr

+0

'Cast'Mirror.Child '(일명'(레이블 : Optional , 값 : Any) ') 관련없는 유형'Person 'always fails' – DesperateLearner

관련 문제