2017-10-11 2 views
1

MongoDB에서 DateTime 속성이있는 레코드를 가져 오려고합니다. 이 속성은 ISODate이지만 Perfect-MongoDB API를 통해 긴 데이터 형식 (1970 년부터 밀리 초)으로 수신됩니다.Swift Linux에서 긴 데이터 타입의 언 래핑

코드는 다음과 같습니다

if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? Int64 
{ 
let date = Date(timeIntervalSince1970: TimeInterval(intDate/1000)) 
} 

이 코드는 맥 OSX에서 잘 작동한다. 그러나 리눅스에서는 created["$date"] as? Int64이 항상 nil입니다.

저는 Int64 대신 DoubleNSNumber을 사용하는 것을 포함하여 두 가지 시도를했지만 여전히 nil입니다.

이 번호에 액세스하는 방법에 대한 아이디어가 있으십니까? 나는 그것을 읽을 수있는 날짜로 변환해야하고, 내가하고있는 방식은 1970 년 이후 초 단위의 Double 값을 필요로하는 TimeInterval()을 통해 이루어 지므로 1000 단계로 나눌 수 있고 그 단계에서 Double로 변환 할 수 있어야합니다.

편집 : 이것은 intDate이 여전히 nil 인 NSNumber 코드이므로 let date 행을 통과하지 않습니다. something은 전무

if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? NSNumber 
{ 
    let date = Date(timeIntervalSince1970: TimeInterval(NSDecimalNumber(decimal:intDate.decimalValue/1000).doubleValue)) 
} 

편집이되지 않습니다 : 당신이 캐스팅 할 수 있도록,

var dictionary : [String:Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]] 
+0

당신은 당신의 NSNumber로 시도 무엇을 보여줄 수 있습니까? 그게 효과가있다. –

+0

@MartinR 내 편집에 해당 코드를 추가했습니다. – Tyress

+0

Try as as? Int' ... –

답변

1

은 분명히 정수 유형 및 Linux 스위프트의 NSNumber 사이의 제한된 변환이이 경우에 대한 사전 샘플 정확한 유형,이 경우 Int이다 는 :

let dictionary : [String: Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]] 

if let something = dictionary["Something"] as? [String:Any], 
    let numDate = something["$date"] as? Int { 

    let date = Date(timeIntervalSince1970: Double(numDate)/1000) 
    print("Date:", date) 
} 
+0

Int는 64 비트 플랫폼에서 Int64 용 타이타니아가 아니 었습니다 (대다수입니다). – user28434

+0

@ user28434 : Int는 Int64 (또는 32 비트 플랫폼에서는 Int32)와 크기가 같습니다. 하지만 다른 유형입니다. 'let y : Int64 = Int (123)'이 컴파일되지 않는지 확인할 수 있습니다. –

+0

좋아, 알았어. 나는 대답의 코드가 질문과 거의 같다고 생각했다. – user28434

관련 문제