2017-10-12 2 views
0

날짜를 알려진 고정 된 시점으로 초기화해야합니다. 스위프트 부족 날짜 리터럴, 나는 시도 :Swift 날짜 리터럴/문자열에서 날짜 초기화

extension DateFormatter 
{ 
    convenience init(_ format: String) 
    { 
     self.init() 
     self.dateFormat = format 
    } 
} 

extension Date 
{ 
    init?(_ yyyyMMdd: String) 
    { 
     let formatter = DateFormatter("yyyyMMdd") 
     self = formatter.date(from: yyyyMMdd) 
    } 
} 

불행하게도, 나는 초기화의 일부로 self = ... 또는 return formatter.date...을 쓸 수 없습니다.

그러나, 난 아주 많이 쓰고 싶습니다

let date = Date("20120721") 

내가 어떻게 이것을 달성 할 수 있습니까?

+0

주 –

답변

3

self에 값을 할당하여 struct을 초기화합니다. 귀하의 경우 문제는 formatter.date(from:) (선택 사양)를 반환한다는 것입니다, 그래서 당신은 랩을 해제해야 할 첫 번째 :

extension Date: ExpressibleByStringLiteral { 
    public init(stringLiteral value: String) { 
     let formatter = DateFormatter("yyyyMMdd") 
     self = formatter.date(from: value)! 
    } 
    public init(extendedGraphemeClusterLiteral value: String) { 
     self.init(stringLiteral: value) 
    } 
    public init(unicodeScalarLiteral value: String) { 
     self.init(stringLiteral: value) 
    } 

} 

let date: Date = "20120721" 
: 당신은 심지어 ExpressibleByStringLiteral 프로토콜을 채택 하여 리터럴 문자열에서 날짜를 초기화 할 수 있습니다

extension Date { 
    init?(yyMMdd: String) { 
     let formatter = DateFormatter("yyyyMMdd") 
     guard let date = formatter.date(from: yyMMdd) else { 
      return nil 
     } 
     self = date 
    } 
} 

그러나 잘못된 날짜는 런타임에 충돌합니다.

두 개 발언 :

  • 당신은 포매터를 설정해야이 사용자의 로케일 설정의 독립적 인 날짜 문자열을 구문 분석 할 수 있도록 Locale(identifier: "en_US_POSIX")에 로케일.
  • 결과는 또한 (예 : TimeZone(secondsFromGMT: 0)와 같은 고정 된 값으로 포매터 시간대를 설정하지 않으면, 현재의 시간대에 따라 달라집니다.이 날짜 형식 문자열에 달`MM`을해야한다는
+0

글쎄, 정말 멋지다! 실제로 구조체 (포인터를 변경하지 않을 것이라고?)에 할당 할 수 있고 ExpressibleByStringLiteral 프로토콜이 있다는 것을 알았습니다. 내 기대를 초과했습니다. 감사합니다 !!!! – Adeline

+0

@Adeline : 있습니다. 포인터가 없다 struct는 * value * 타입이다 –

+0

나는 마틴의 마지막 발언을 더욱 강조하고 싶다 - 적어도 굵은 글씨, 밑줄 친, 이탤릭체, 42pt 폰트로되어 있어야한다. 로케일에서 구문 분석하기/당신이 고려하지 않은 시간대. 날짜 형식은 로케일/캘린더/시간대에 민감하며, 기본적으로 사용자의 현재 값을 사용합니다. –