2016-09-25 8 views
5

쿼리가 선택적 값을 반환하고 오류를 throw 할 수있는 SQLite 라이브러리를 사용하고 있습니다. 조건부로 값의 랩을 풀고 싶으면 오류를 반환하면 nil을받습니다. 이 기 해제를 강제하는 것을 방지하기 위해 방법이 있나요함수는 throw하고 선택 사항을 반환합니다. 한 줄에서 조건 적으로 unwrap을 할 수 있습니까?

func getSomething() throws -> Value? { 
    //example function from library, returns optional or throws errors 
} 


func myFunctionToGetSpecificDate() -> Date? { 
    if let specificValue = db!.getSomething() { 
     let returnedValue = specificValue! 
     // it says I need to force unwrap specificValue, 
     // shouldn't it be unwrapped already? 

     let specificDate = Date.init(timeIntervalSinceReferenceDate: TimeInterval(returnedValue)) 
     return time 
    } else { 
     return nil 
    } 

} 

:이는 모습입니다,이,이 코드가 설명하는 방법으로 단어를 완전히 확실하지 않다? Swift3으로 업데이트하기 전에는 강제로 강제로 unwrap하지 않았습니다.

다음은 실제 코드입니다. 그냥 모든 항목에서 최신 타임 스탬프를 얻으려고 노력 :

func getLastDateWithData() -> Date? { 
    if let max = try? db!.scalar(eventTable.select(timestamp.max)){ 

     let time = Date.init(timeIntervalSinceReferenceDate: TimeInterval(max!)) 

     // will max ever be nil here? I don't want to force unwrap! 
     return time 

    } else { 
     return nil 
    } 
} 

답변

6

을하는 기능은 옵션

func getSomething() throws -> Value? { ... } 

다음 try? getSomething()가 유형 Value?? 당신의 "이중 옵션"을 반환 수익을 발생하는 경우 두 번 풀어야한다 :

if let optval = try? getSomething(), let val = optval { 

} 

여기서 첫 번째 바인딩함수가 throw하지 않았 으면이 성공하고 반환 값이 nil이 아닌 경우 let val = optval이 에 성공합니다.

case let 패턴 val??.some(.some(val)) 대한 지름길

if case let val?? = try? getSomething() { 

} 

에 일치으로 단축 할 수있다.

+0

정확히 내가 무엇을 찾고 있었습니까. 나는 전에 보지 못한 것을 보지 못했다. 나는 그것에 대해 읽어야 할 것이다. 또한 .some (.some (val))은 무엇을 의미합니까? –

+0

@twiz_ : 선택 사항은'.none'과'.some (wrapped) '가있는 열거 형입니다. '.some (.some (val))'은 중첩 된 선택적 값으로 nil이 아니며 unwrapped 값도 nil이 아닙니다. 다음은 중첩 된 선택 사항을 사용하는 또 다른 예입니다. http://stackoverflow.com/questions/27225232/two-or-more-optionsals-in-swift. –

+0

까다로운 까닭은, 호출의 성공에만 관심이 있고 반환 된 데이터가 아닌 경우, 호출이 실패를 나타내는 nil을 반환하면 쉽게 혼동 될 수 있기 때문입니다. –