5

クエリがオプションの値を返し、エラーをスローする SQLite ライブラリを使用しています。条件付きで値をアンラップするか、エラーが返された場合は nil を受け取りたいです。これをどのように表現するかは完全にはわかりません。このコードで説明します。これは次のようになります。

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 に更新する前は、ここでアンラップを強制する必要はありませんでした。

以下が実際のコードです。すべてのエントリから最新のタイムスタンプを取得しようとしています:

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
    }
}
4

2 に答える 2

9

更新: Swift 5 の時点でtry?、オプションの式に適用されても別のレベルのオプション性が追加されないため、「単純な」オプションのバインディングで十分です。関数がエラーをスローせず、 を返さなければ成功ですnilval次に、ラップされていない結果にバインドされます。

if let val = try? getSomething() {
    // ...
}

(Swift ≤ 4 に関する以前の回答:)関数がオプションをスローして返す場合

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

次にtry? getSomething()、タイプの「double optional」を返し、Value??2 回アンラップする必要があります。

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

}

ここでlet optval = ...、関数がスローしなかった場合は最初のバインディングが成功しlet val = optval、戻り値が でない場合は 2 番目のバインディングが成功しますnil

case letこれは、パターン マッチングを使用して短縮できます。

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

}

val??のショートカットはどこにありますか.some(.some(val))

于 2016-09-25T20:14:10.533 に答える