2016-12-16 1 views
1

을 확장하고자하므로 dateTaken 필드에 특별한 JSONSerializable 메서드를 추가하려고합니다. 하지만 Date은 구조체이므로 확장 할 수 없다는 것을 알아 냈으므로 NSDate입니다. 하지만 난이 자바가 아닌 Dateswift 3 NSDate 또는 Date 서브 클래스 방법

class DateTaken : NSDate, JSONRepresentable { 
    static var formatter = DateFormatter() 

    var JSONRepresentation: AnyObject { 
     DateTaken.formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" // ISO8601 
     DateTaken.formatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone! 
     return DateTaken.formatter.string(from:self as Date) as AnyObject 
    } 
    var JSONLocalTimeRepresentation: AnyObject { 
     DateTaken.formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" 
     return DateTaken.formatter.string(from:self as Date) as AnyObject 
    } 
} 

let d = Date() 
let dateTaken : DateTaken = DateTaken.init(timeInterval: 0, since: d) 
// exception 



(lldb) p NSDate.init(timeInterval: 0, since: dateTaken) 
(NSDate) $R0 = 0x0000000156e6fdb0 2014-10-13 08:49:18 UTC 
(lldb) p dateTaken.init(timeInterval: 0, since: dateTaken) 
error: <EXPR>:3:1: error: 'init' is a member of the type; use 'type(of: ...)' to initialize a new object of the same dynamic type 
dateTaken.init(timeInterval: 0, since: dateTaken) 
^ 
      type(of: ) 
+1

"날짜는 구조체이며 확장 할 수 없습니다."무엇을 ?? Extend는 서브 클래스와 완전히 같지 않습니다. – matt

+0

구조체 ('Date'와 같은)는 확장 될 수 없지만 'NSDate'와 같은 클래스는 확장 될 수 있습니다. 어느 경우 든, 당신은해서는 안됩니다. 확장 기능을 사용하십시오. – Alexander

+0

죄송합니다. JS에서 왔어. 값이 'instanceof' DateTaken인지 테스트하고 싶으면 다른 방법으로 직렬화해야합니다. 나는 모든 날짜를 같은 방식으로 직렬화하고 싶지 않다. 이것을 달성하기 위해'extensions '을 어떻게 사용합니까? – michael

답변

0

에서 DateTaken을 얻는 방법을 알아낼 수 없습니다. 이에 대한 확장 기능이 있습니다.

extension NSDate: JSONRepresentable { 
    static var formatter = DateFormatter() 

    var JSONRepresentation: AnyObject { 
     DateTaken.formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" // ISO8601 
     DateTaken.formatter.timeZone = TimeZone(abbreviation: "UTC") 
     return DateTaken.formatter.string(from: self as Date) as AnyObject 
    } 

    var JSONLocalTimeRepresentation: AnyObject { 
     DateTaken.formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" 
     return DateTaken.formatter.string(from: self as Date) as AnyObject 
    } 
} 

는 또한 formatter의 공유에 의한이 버그가있다 생각한다. timeZone이 처음으로 JSONRepresentation에 설정된 후 JSONLocalTimeRepresentationJSONRepresentation처럼 동작합니다. 나는 틀릴 수도 있지만 지금은 테스트 할 수 없습니다. 체크 아웃 할 가치가있어.

관련 문제